王爽16位汇编第50页问题3.3求解
10000H 23
10001H 11
10002H 22
10003H 66
汇编代码如下:
mov ax,1000H
mov ds,ax
mov ax,[0]
mov bx,[2]
mov cx,[1]
add bx,[1]
add cx,[2]
写出以上的指令执行后寄存器ax,bx,cx中的值
mov ax,[0]这一步为啥执行后ax中的值ax=1123H 而不是23H
mov不是传送指令么 又不是add指令咋还加上了1000H呢 展开
2020-05-06
ax可以分解成ah高位和al低位,两个寄存器。比作两个盒子
而一个内存算一个盒子,比如1000H里面的数据就能放在al的盒子里面。
mov ax,1000H,这一步,把1000h里面的23存到了al低位寄存器去了。
然后,mov ax,[0]。其中[0]表示把1000H和1001H两个数值赋值到ax。(就是把1000h这个盒子跟1001h盒子,两个组合起来放到ax这个大盒子。
至于为什么是1000h在低位呢,就好比,你在盒子里放东西,是不是先拿最近,最开始的东西放到盒子的底部
在补充一点,首先了解一些[0]的概念,它表示一个字单元,而字单元是一个16位的内存单元(比作一个16位大的盒子,但是一个内存才是8位的盒子啊,那只有两个内存才能组合成16位的盒子了)。
在深入一点的话,就是前面的知识点。段地址:偏移地址,组合。
mov ds,ax
这两句是把段寄存器ds设置为1000H
mov ax,[0]
把逻辑地址为0的值赋给ax,[0]是一个地址,而不是一个数,中括号括起来的都作为地址解释的。
实际上,这个逻辑地址会被换算成绝对地址后,从绝对地址处取值。这也就是为什么刚开始要设置ds段寄存器的缘故了,因为要用它换算:ds X 16(16十进制,或者10H十六进制) + 逻辑地址
换算后就是10000H了
注意:ax是一个十六位的寄存器,而一个内存单元是8位,因此会把连续的两个内存单元中的数组和成一个16位的数,放到ax中,即把10001H和10000H中的数组合为1123存进ax中
这一句如果换为mov al,[0]
因为al是八位的寄存器,所以可以直接把10000H中的23存进al中。
下面的mov bx,[2]一个道理,会把10003H和10002H中的6622存进bx
下面cx = 2211
bx = 6622h + 2211h =8833h
cx = 2211h + 6622h = 8833h
mov ax,[0]这一步为啥执行后ax中的值ax=1123H 而不是23H
因为ax是一个16位的数据.所以存储1123H, 而23H是一个8位数据
mov不是传送指令么 又不是add指令咋还加上了1000H呢
mov是一个传送指令,但是我们也可以把它当成一个赋值的指令
这里mov ax,1000H的意思是将1000H赋值(传送)到ax
PS:若有不明白的地方,可以追问
是不是意思是将目前的地址1000H处的数据传递给ax寄存器阿?
ax是一个word,16bit的,因此连续获取两个byte,也就是说连续获取地址1000H(低位)和1001H(高位)处的数据,组合成了1123H了
MOV AX,23H 等于是 MOV 1000H,23H(当然这样写是不正确的)结果必然是1023H