鱼C论坛

 找回密码
 立即注册
查看: 5737|回复: 8

请教王爽《汇编》“一个奇怪的程序”几个问题

[复制链接]
发表于 2013-2-6 15:55:52 | 显示全部楼层 |阅读模式
6鱼币
本帖最后由 遒羽 于 2013-2-6 16:11 编辑

王爽《汇编》实验8中有一题:
分析下面的程序,在运行前思考:这个程序可以正确返回吗?
运行后再思考:为什么是这个结果?
  1. assume cs:code
  2. code 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. code ends
  25. end start
复制代码
debug查看机器码:
QQ截图20130206154458.png
下面是我的几个问题:
1,按照我的理解,程序执行完s后执行s0:jmp short s,这时候应该跳到s,又开始循环执行,对不对?这样是不是s成了一个死循环?
2,debug调试过程如下:
QQ截图20130206155156.png QQ截图20130206155506.png
下面的S1,S2有被执行过吗,是怎样被执行的??
3,我们再看程序执行完s,也就是执行到mov cs:[di],ax的时候,程序跳转回s,执行
QQ截图20130206160414.png
后,直接就跳转 QQ截图20130206160558.png 结束,请问这是怎么跳的??

谢谢!!

最佳答案

查看完整内容

这里是程序刚开始执行,那连个指令依旧为NOP mov si,offset s2 mov ax,cs:[si] 这两句让AX=jmp short s1的机器码了 也就是F6EB(反过来读) mov di,offset s mov cs:[di],ax 这两句把jmp short s1这两个字节的机器码 替换掉 那两个字节的NOP 也就是说标号s处的指令成了机器码EBF6 EB表示JMP的机器码,F6表示位移数,F6是-10的补码 也就是向前跳10个字节,刚好来到开头 于是DEBUG翻译成jmp 0000 就这样跳 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-2-6 15:55:53 | 显示全部楼层
1.jpg
这里是程序刚开始执行,那连个指令依旧为NOP
mov si,offset s2
mov ax,cs:[si]


这两句让AX=jmp short s1的机器码了
也就是F6EB(反过来读)

mov di,offset s
mov cs:[di],ax

这两句把jmp short s1这两个字节的机器码 替换掉 那两个字节的NOP
也就是说标号s处的指令成了机器码EBF6
EB表示JMP的机器码,F6表示位移数,F6是-10的补码
也就是向前跳10个字节,刚好来到开头
于是DEBUG翻译成jmp 0000
2.jpg

就这样跳回去了

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

使用道具 举报

发表于 2013-2-6 16:22:54 | 显示全部楼层
不是有赋值的嘛。。
mov ax,cs:[si]
mov cs:[di],ax
这个执行后你自己u查看下命令,他把mov ax, 0   nop  nop换了,变成jmp 0000指令了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-2-6 18:56:16 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-1-30 00:05:16 | 显示全部楼层
遒羽 发表于 2013-2-6 18:56
原来如此!多谢!

请问,在s中为什么jmp short s1没跳转到s1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-1-30 00:05:52 | 显示全部楼层
七月之变 发表于 2013-2-6 16:22
不是有赋值的嘛。。
mov ax,cs:[si]
mov cs:[di],ax

请问,在s中为什么jmp short s1没跳转到s1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-1-30 09:07:04 | 显示全部楼层
Road_7 发表于 2014-1-30 00:05
请问,在s中为什么jmp short s1没跳转到s1

jmp指令不是指定地址,是指定偏移量
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-2-14 14:03:22 | 显示全部楼层
又多学习了一个。感谢。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-6-18 08:04:35 | 显示全部楼层
谢谢,现在彻底知道了,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-25 13:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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