王爽 汇编语言 检测点3.1 已验证
初学汇编,在阅读王爽的汇编语言的同时,也在做着书上的检测点。刚刚做完检测点3.1后,上网搜了一下检测点3.1的答案,发现第2题的搜到的答案和我自己做的答案,总是有点出入,而且连搜几个,有出入的地方还都不一样。执着的我始终相信自己的答案没有错误!!于是为了证明自己,把题目敲到了dos系统里跑了一下。下面就将题目和跑出的结果奉上给各位。
题目:
答案:
指令 | CS | IP | 相关寄存器 |
mov ax,6622 | 2000 | 0003 |
AX=6622 |
jmp 0ff0:0100 | 0FF0 | 0100 | |
mov ax,2000 | 0FF0 | 0103 | AX=2000 |
mov ds,ax | 0FF0 | 0105 | DS=2000 |
mov ax,[0008] | 0FF0 | 0108 | AX=C389 |
mov ax,[0002] | 0FF0 | 010B | AX=EA66 |
【注】1.上述数据都是16进制形式
2.网上搜到的大部分答案错误地方在,jmp指令执行之后CS应该始终保持着0FF0不变,而IP做相应的增加。例如在执行 mov ax,2000时,指令执行的地址在10000H处,该地址是通过“段地址(CS)左移一位+偏移地址(IP)”得到的,即 FF00H+0100H=10000H。当然对于我们人类来说10000H,我们更习惯于把它看作是“1000H左移一位+0”,然而对于计算 机来说,10000H就是通过“CS寄存器里的值左移一位+IP寄存器里的值”得到的。而CS寄存器里的值在执行完jmp指令后就 一直是0FF0H,并没有发生过改变。所以之后执行的指令地址都是以0FF0作为段地址得到的。
下图为网上找到的一种错误的答案:
下面我将题目整个的运行过程贴出来:
初始状态:
mov ax,6622
jmp 0ff0:0100
mov ax,2000
mov ds,ax
mov ax,[0008]
mov ax,[0002]
感谢您的阅读,初学汇编,若有说得不当之处,敬请各位大佬指正。