鱼C论坛

 找回密码
 立即注册
查看: 2526|回复: 7

[已解决]实验8有一点不能理解,求大神

[复制链接]
发表于 2017-10-17 13:52:14 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. assume cs:codesg
  2. codesg segment
  3.    mov ax,4c00h
  4.    int 21h
  5.    
  6. start:mov ax,0
  7.     s:nop
  8.           nop
  9.           
  10.           mov di,offset s
  11.           mov si,offset s2
  12.           mov ax,cs:[si]
  13.           mov cs:[di],ax
  14.           
  15.         s0:jmp short s
  16.        
  17.         s1:mov ax,0
  18.         int 21h
  19.         mov ax,0
  20.        
  21.         s2:jmp short s1
  22.            nop
  23.           
  24.         codesg ends
  25.         end start
复制代码


这是实验八的程序,执行到s2的时候机器指令是ebf6,然后跳转到s,然后上移10个字节,到了mov ax,4c00h,但是为什么s2处的指令是ebf6呢,s2:jmp short s1,这是跳转到s1,但是s2,s1之间只有五个字节啊,为什么是f6要移动十个字节呢?
最佳答案
2017-10-17 14:20:12
当指令执行到s0:jmp short s时,该指令得到执行,编译器算出的ip位移量为8-18h=-16(补码F0),(ip)=(ip)+位移量=18h+(-16)=8,cs:8指向s;
当指令执行到s标段jmp命令时,第1个字节中的机器码为EBF6,给出的ip位移量为-10(补码F6),(ip)=(ip)+位移量=ah+(-10)=0,cs:0指向第一条指令。

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-10-17 14:20:12 | 显示全部楼层    本楼为最佳答案   
当指令执行到s0:jmp short s时,该指令得到执行,编译器算出的ip位移量为8-18h=-16(补码F0),(ip)=(ip)+位移量=18h+(-16)=8,cs:8指向s;
当指令执行到s标段jmp命令时,第1个字节中的机器码为EBF6,给出的ip位移量为-10(补码F6),(ip)=(ip)+位移量=ah+(-10)=0,cs:0指向第一条指令。

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-10-17 14:48:54 | 显示全部楼层
丶忘却的年少o 发表于 2017-10-17 14:20
当指令执行到s0:jmp short s时,该指令得到执行,编译器算出的ip位移量为8-18h=-16(补码F0),(ip)=(ip)+位 ...

可是s的ip为0008,上移十个字节,也不是mov ax,4c00h,
(ip)=(ip)+位移量=ah+(-10)为什么等于0???
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-17 15:49:36 | 显示全部楼层
灰灰灰 发表于 2017-10-17 14:48
可是s的ip为0008,上移十个字节,也不是mov ax,4c00h,
(ip)=(ip)+位移量=ah+(-10)为什么等于0???

不好意思,啰嗦一下。你直接看最后一段红色段就可以了,要是不明白可以全部看完。
首先程序从上往下下来会把s2标号的代码赋值到s标号的地方,然后再执行s0标号的代码,s0是要程序跳到s标号的地方,这里都是没问题的。
这个时候s标号因为已经复制过来程序了,就编程s2标号一模一样的指令,而我们知道跳转只有方向和偏移的。正常的来看s2标号的代码,它要跳到s1,方向是往上,偏移是10。回到s标号的代码这里来,上一段已经说过了,程序现在执行到的地方是s标号。
s标号的程序那就是要 方向是往上,偏移是10,按照这个跳转,而s标号的开始ip = 0008,jmp指令占2字节,执行完指令后才会跳转,那不刚好是 10,然后 10-10 = 0。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-10-18 12:59:16 | 显示全部楼层
丶忘却的年少o 发表于 2017-10-17 15:49
不好意思,啰嗦一下。你直接看最后一段红色段就可以了,要是不明白可以全部看完。
首先程序从上往下下来 ...

嗯嗯,这一点我懂了,可是s0和s2之间的偏移量为什么是十个字节啊,一共不是cd 21 b8 00 00五个字节吗?
122945cmmno8e8a8tu1rn6.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-18 13:13:59 | 显示全部楼层
灰灰灰 发表于 2017-10-18 12:59
嗯嗯,这一点我懂了,可是s0和s2之间的偏移量为什么是十个字节啊,一共不是cd 21 b8 00 00五个字节吗?

唉,就是上面那句红色的话。换个说法好了,机器码太难说,看你发的图
看图,s2开始的语句是jmp,前面的地址是076A:20,s1开始的语句地址是076A:18。但是程序是先运行完这句话再执行的跳转,这个要清楚,就是说先运行完jmp语句,才能跳!
如果没猜错的话,你截的图的下一句语句地址是076A:22,加入有一个箭头,在运行完jmp语句后箭头的位置在076A:22,然后箭头要往上跳到标号s1的地方,地址是076A:18,减一下,22H-18H = AH,就是10。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-10-18 14:52:53 | 显示全部楼层
丶忘却的年少o 发表于 2017-10-18 13:13
唉,就是上面那句红色的话。换个说法好了,机器码太难说,看你发的图
看图,s2开始的语句是jmp,前面的 ...

嗯嗯,懂了,我理解的还是不够深。。。谢谢了~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-18 15:53:09 | 显示全部楼层
灰灰灰 发表于 2017-10-18 14:52
嗯嗯,懂了,我理解的还是不够深。。。谢谢了~

别忘记点下“最佳答案”呀
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-29 08:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表