就是要努力呀 发表于 2020-3-22 11:28:24

检测点2.3

修改cs:ip的值使它指向代码段首地址        第一次更改
mov ax, bx; 执行完指令,ip + 2                第二次更改
sub ax, ax; 执行完指令,ip + 2                第三次更改
jmp as; 执行完指令,ip= 0                第四次更改

2515504707 发表于 2020-3-30 23:21:09

答:一共修改四次

第一次:读取mov ax,bx之后

第二次:读取sub ax,ax之后

第三次:读取jmp ax之后

第四次:执行jmp ax修改IP

最后IP的值为0000H,因为最后ax中的值为0000H,所以IP中的值也为0000H


应该是这样

就是要努力呀 发表于 2020-3-31 10:24:23

2515504707 发表于 2020-3-30 23:21
答:一共修改四次

第一次:读取mov ax,bx之后


你要先修改cs:ip的值让他指向这个代码的第一句话呀
不然这个源程序怎么运行

就是要努力呀 发表于 2020-3-31 10:25:34

就是要努力呀 发表于 2020-3-31 10:24
你要先修改cs:ip的值让他指向这个代码的第一句话呀
不然这个源程序怎么运行

假如我的代码放在内存中的1000:0位置
cs:ip初始化指向2000:0
那肯定要先修改cs:ip让它指向1000:0呀

2515504707 发表于 2020-4-1 09:08:05

就是要努力呀 发表于 2020-3-31 10:25
假如我的代码放在内存中的1000:0位置
cs:ip初始化指向2000:0
那肯定要先修改cs:ip让它指向1000:0呀

有道理

朔风刀 发表于 2020-4-3 09:38:48

2515504707 发表于 2020-3-30 23:21
答:一共修改四次

第一次:读取mov ax,bx之后


为什么jump ax之后ip=0了

adamhex 发表于 2020-4-12 21:47:17

(1)mov ax,bx
(2)sub ax,ax   //sub,减法指令
(3)jmp ax
第一次修改,ip指向即读取指令(1)
第二次修改,(1)执行完成,ip+2
第三次修改,(2)执行完成,ip+2,ax==0
第四次修改,(3)执行完成,ip==ax==0

adamhex 发表于 2020-4-12 21:52:40

朔风刀 发表于 2020-4-3 09:38
为什么jump ax之后ip=0了

因为第二条指令 sub ax,ax ,表示寄存器ax中的值自身做减法存入ax寄存器,即寄存器归0。
第三条指令 jmp ax,表示段地址CS值不变,只改变IP值。第二条指令ax已经归0,所以jmp ax 指令完成ip==0.
第三条指令你可以理解为 mov ip,ax 即mov ip,0000H
希望有所帮助

17349801063 发表于 2020-5-21 23:00:58

adamhex 发表于 2020-4-12 21:52
因为第二条指令 sub ax,ax ,表示寄存器ax中的值自身做减法存入ax寄存器,即寄存器归0。
第三条指令 jm ...

牛逼,懂了

嘟讀 发表于 2020-6-5 23:14:13

我觉得第一次直线代码段地址不算,因为题目说代码执行后,所以不考虑执行第一行代码之前的更改。所以我觉得二楼的答案是正确的

2262060044 发表于 2024-4-10 21:13:32

执行 jmp as ,ip 不需要加2嘛
页: [1]
查看完整版本: 检测点2.3