能力值:
( LV2,RANK:10 )
|
-
-
2 楼
不要只看教程只听老师的,因为汇编器不是他们写的!!!需要使用具体汇编器实践!
|
能力值:
(RANK:570 )
|
-
-
3 楼
2楼说得对。用别人的编译器,只能遵守别人的语法,什么时候你能写编译器
代码爱怎么写怎么写
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
但我是刚学啊,没有几位老大的水平,问题总要弄清楚啊
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
这个问题其实很简单的
你写汇编代码的时候,你可以试着加这样的代码
mov ax, byte ptr [bx] // 16位CPU
mov ax, byte ptr [ebx] // 32位CPU
mov ax, word ptr [bx]
mov ax, word ptr [ebx]
mov ax, [bx]
mov ax, [ebx]
你看编译器会不会警告?
上次说过一点,取字节值放入寄存器时,看寄存器所对应的位数,如果将字节放入ax,mov指令会做扩展,在汇编里是movzx或movsx,movzx为零扩展,movsx为符号扩展
再说详细点就是,如果这条指令被执行的话,你觉得值为多少?
ax原值为0x1234,现在指令mov ax, byte ptr [bx]执行,假设bx中的为0x3456,这里是取0x3456地址的值为0x76
那么,指令执行完毕,ax中是0x1276,还是什么呢?
很显然,汇编指令不能存在有这样误解指令,要不就是mov al, byte ptr [bx],要不就是mov ax, word ptr [bx],而mov ax, word ptr [bx]可直接写成mov ax, [bx]
在上面的指令中,如果要mov ax, byte ptr [bx],可以看需求,是零扩展还是符号扩展,将mov换成movzx或movsx即可.
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
非常感谢苦茶的回答,但是你说
而mov ax, word ptr [bx]可直接写成mov ax, [bx]
也就是我最上面的第一条例子mov ax [bx+5]就是
mov ax,word ptr [bx+5],那就是说没有歧义啊,怎么错了?
|
能力值:
(RANK:570 )
|
-
-
7 楼
mov ax,[bx+5]
中间加逗号
我用OD,改成32位寻址mov eax,[ebx+5]可以正常编译成机械码
如果你本来就是说有逗号的,我只能说,学习灵活一点,尽信书不如无书。
当然,你看的东西也可能在说编码风格,加上word ptr的确提高了代码可读性
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
这个是根据编译器的一个规则来的
有些编译器为了明确该指令的作用,所以需要指定具体的大小
象TASM和MASM在某些方面强制性就不同
mov ax, [bx+5]报错,目的就是为了明确该指令的取值大小,一般默认是取bx中的值+5这个地址中的16位值放入ax,,而不是取8位值放入ax,如果是8位,直接用al或ah即可
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
懂了,谢谢苦茶兄.以后还要请你多多帮助
|