首页
社区
课程
招聘
再问寻址方式
发表于: 2007-3-21 07:30 3510

再问寻址方式

2007-3-21 07:30
3510
上次我发了一个帖子是询问关于寻址方式在不使用ptr byte或者ptr word 的默认的情况下是按照字寻呢还是按照字节寻,有位叫苦茶的朋友告诉我这主要看是后面的寄存器,即

mov ax [bx+5]

的意思就是取出一个16位的字给ax,因为ax是16位的,但是今天我看中山大学的视频,上面说这是错的,原因是未能指出是按照字寻还是字节寻,也就是说一定要加ptr byte或者ptr word才对

但是这条指令又是对的

mov si,5
lea di,name 6[si]
mov al,[di]

这段指令的最后一句没有ptr byte 但确是对的
这又是怎么回事

谁给我解答下?谢谢

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 8026
活跃值: (2511)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
不要只看教程只听老师的,因为汇编器不是他们写的!!!需要使用具体汇编器实践!
2007-3-21 16:37
0
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
3
2楼说得对。用别人的编译器,只能遵守别人的语法,什么时候你能写编译器
代码爱怎么写怎么写
2007-3-21 17:24
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
但我是刚学啊,没有几位老大的水平,问题总要弄清楚啊
2007-3-21 18:25
0
雪    币: 200
活跃值: (12)
能力值: ( 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即可.
2007-3-21 20:48
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
非常感谢苦茶的回答,但是你说

而mov ax, word ptr [bx]可直接写成mov ax, [bx]

也就是我最上面的第一条例子mov ax [bx+5]就是
mov ax,word ptr [bx+5],那就是说没有歧义啊,怎么错了?
2007-3-21 21:51
0
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
7
mov ax,[bx+5]

中间加逗号

我用OD,改成32位寻址mov eax,[ebx+5]可以正常编译成机械码

如果你本来就是说有逗号的,我只能说,学习灵活一点,尽信书不如无书。

当然,你看的东西也可能在说编码风格,加上word ptr的确提高了代码可读性
2007-3-21 22:02
0
雪    币: 200
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
这个是根据编译器的一个规则来的

有些编译器为了明确该指令的作用,所以需要指定具体的大小

象TASM和MASM在某些方面强制性就不同

mov ax, [bx+5]报错,目的就是为了明确该指令的取值大小,一般默认是取bx中的值+5这个地址中的16位值放入ax,,而不是取8位值放入ax,如果是8位,直接用al或ah即可
2007-3-22 00:28
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
懂了,谢谢苦茶兄.以后还要请你多多帮助
2007-3-22 07:25
0
游客
登录 | 注册 方可回帖
返回
//