Loser_YiMo 发表于 2020-4-21 22:12:01

涉及到寄存器DS的汇编指令:mov al,[0] 与mov ax,[0](DS=0000)

mov bx,0
mov ds,bx
mov al,
即将0000:0地址中的数据move到al中,都为一字节,没有问题

而我在做王爽老师《汇编语言》第三版P55 检测点3.1时
原文如下:

(1)在Debug中,用“d 0:0 1f”查看内存,结果如下。
0000:0000 70 80 F0 30 EF 60 30 E2-00 80 80 12 66 20 22 60
0000:0010 62 26 E6 D6 CC 2E 3C 3B-AB BA 00 00 26 06 66 88

下面的程序执行前,AX=0,BX=0,写出每条汇编指令执行完成后相关寄存器中的值。

mov ax,1
mov ds,ax
mov ax, '此处答案给出AX=2662H
…………
mov ax, AX为什么是读取了一个字而不是一个字节?
AX为什么不等于0062H?

本人对汇编理解并不透彻,如问题有什么让人问中生问的地方请指出,如因为我粗心看书漏掉了某个重要知识点,因我已经根据前面的知识进行了相关分析并没有得到结果,请各位大神指明!
感谢!

sunrise085 发表于 2020-4-21 22:12:02

你对寄存器理解不到位
AX寄存器分为AL和AH,一个是低字节一个是高字节,寄存器AX就是个16位寄存器,可以整体用,也可以分成两部分用
当你写mov al,时,就是读一个字节到AL,
当你写mov ax,时,就是读一个字到AX

人造人 发表于 2020-4-22 02:20:24

其实没有什么为什么,编译器就是这样去解释代码的

mov ax,
你写成这样,汇编语言编译器(汇编器)就认为是读取一个字

mov al,
你写成这样,汇编器就认为是读取一个字节

jkluoling1992 发表于 2020-4-22 06:55:54

本帖最后由 jkluoling1992 于 2020-4-22 06:59 编辑

0000代表读取16位,按长度读取吧

sunrise085 发表于 2020-4-22 09:14:46

jkluoling1992 发表于 2020-4-22 06:55
0000代表读取16位,按长度读取吧

不懂请不要胡乱猜测。0000是地址,地址的长度是由存储空间整体大小来决定的,与读取一个字节两个字节没有任何关系。。。。

jkluoling1992 发表于 2020-4-22 09:25:27

sunrise085 发表于 2020-4-22 09:14
不懂请不要胡乱猜测。0000是地址,地址的长度是由存储空间整体大小来决定的,与读取一个字节两个字节没有 ...

那地址为啥是16位长度呢,16位寄存器难道读取的长度不是16位?,这里寄存器就是一个完整的寄存器,

sunrise085 发表于 2020-4-22 09:44:24

jkluoling1992 发表于 2020-4-22 09:25
那地址为啥是16位长度呢,16位寄存器难道读取的长度不是16位?,这里寄存器就是一个完整的寄存器,

16位的寄存器读取的当然是16位啦~~
mov al,也是可以的,难道这个也是读取16位??
地址16位只是说明存储空间有2^16个字节单元
但是具体读多少,与指令和寄存器大小有关

jkluoling1992 发表于 2020-4-22 10:09:08

sunrise085 发表于 2020-4-22 09:44
16位的寄存器读取的当然是16位啦~~
mov al,也是可以的,难道这个也是读取16位??
地址16位只是 ...

{:10_257:}这种情况的话,ah里面有值嘛

sunrise085 发表于 2020-4-22 10:16:18

jkluoling1992 发表于 2020-4-22 10:09
这种情况的话,ah里面有值嘛

ah的值不受影响,原来是什么,就还是什么

jkluoling1992 发表于 2020-4-22 10:26:04

sunrise085 发表于 2020-4-22 10:16
ah的值不受影响,原来是什么,就还是什么

搜噶{:10_245:}

caoshuo 发表于 2020-4-22 12:04:22

噢力给
页: [1]
查看完整版本: 涉及到寄存器DS的汇编指令:mov al,[0] 与mov ax,[0](DS=0000)