鱼C论坛

 找回密码
 立即注册
查看: 8642|回复: 13

汇编语言(王爽)》(第九章、实验8分析一个奇怪的程序)看了小甲鱼老师的讲解没懂

[复制链接]
发表于 2013-4-12 11:22:26 | 显示全部楼层 |阅读模式
1鱼币
本帖最后由 琼华 于 2013-4-12 11:24 编辑

求一起学到这的同学大家帮忙每句给加个注解吧 我是新手 听了小甲鱼老师讲完还是没有听懂~~谢谢大家啦~
1 assume cs:codesg 2 codesg segment
3              mov ax,4c00H
4              int 21H
5 start:  
6              mov ax,0
7     s:     
8              nop
9              nop
10              mov di,offset s
11              mov si,offset s2
12              mov ax,cs:[si]
13              mov cs:[di],ax
14     s0:
15             jmp short s
16     s1:
17
           mov ax,0
18             int 21H
19             mov ax,0
20     s2:
21             jmp short s1
22             nop
23 codesg ends
24  end start  

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-4-14 09:30:51 | 显示全部楼层
我只做C++的 帮你顶一个
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-4-17 08:35:28 | 显示全部楼层
来混鱼币咯。。。。
淡定,淡定,淡定……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-4-17 09:57:18 | 显示全部楼层
1 assume cs:codesg 2 codesg segment
3              mov ax,4c00H  ;调用系统21h中断的4ch号功能
4              int 21H
5 start:   
6              mov ax,0  ;ax清零
7     s:      
8              nop     ;空指令
9              nop
10              mov di,offset s  ;将s段的偏移地址(首地址)给di
11              mov si,offset s2  ;将s2段的偏移地址给si
12              mov ax,cs:[si]  ;取cs段偏移为si的内容(也就是jmp short s1)给ax
13              mov cs:[di],ax ;将刚刚取得的内容给s段的首地址处
14     s0:
15             jmp short s  
16     s1:
17
               mov ax,0     ;调用21h中断的00h号功能(使程序中断,cs=psp)
18             int 21H
19             mov ax,0
20     s2:
21             jmp short s1 ;在s段调执行此指令时,程序不会跳到该段,而是执行程序开始处。这个跟psp有关,自己查下
22             nop
23 codesg ends
24  end start  
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-4-17 15:12:37 | 显示全部楼层
还是没搞懂……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-9-2 19:20:38 | 显示全部楼层
没那么复杂,这里考得就是个”jmp short 标号“是按相对位置跳转的。
首先要明白第21行的指令jmp short s1,该指令转为机器码为:EBF6,EB表示jmp short,F6是偏移量的补码表示,即-0AH,即向前跳10个字节。
然后我们从start(楼主代码的第5行)位置开始一步步执行,6-9行不用说了,重点说10-13行,它的目的是将7-8行对应内存位置的两个nop指令(机器码为9090)改写为21行的指令(机器码EBF6),改后就8-9行不再是nop,变成向前跳10个字节的意思。接下来执行15行,然后跳回8行开始执行,然后向前跳10个字节,就来来了第2行3行,然后成功退出。
ps:前面说的机器码都是16进制表示的,如果还是不明白,建议楼主debug,-t单步跟踪,相信就会明朗许多。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-9-2 20:39:10 | 显示全部楼层
其实很简单 就是 8 段 9段 原来是NOP 就是空指令,在执行的过程中 这2个字节的内存地址中的数据被覆盖,让指针指向了能正常退出的 的地址,你调试下就知道了,写这段汇编代码是下了些功夫的实在不行 就编译好 用DEBUG 单步跟踪 下 就知道了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-9-5 23:27:31 | 显示全部楼层
程序从start 开始执行,执行到MOV CS:[DI],AX时将jmp short s1的机器码EBF6保存到cs:[di]中,执行  jmp short s 后跳转至S处,下一步执行MOV CS:[DI],AX保存的机器码EBF6,EB为JMP ,F8(11111000)=-8(11111000+1取反),
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-6-26 16:52:10 | 显示全部楼层
zlliyy 发表于 2016-9-5 23:27
程序从start 开始执行,执行到MOV CS:[DI],AX时将jmp short s1的机器码EBF6保存到cs:[di]中,执行  jmp sho ...

这段的精髓不是jmp转移指令  而是nop占用一个CPU周期与mov ax,0 int 21h中断的妙处
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-9-20 19:42:08 | 显示全部楼层
大家可能会有疑问,F6的原码为-10,而s的偏移为8,那IP+OFFSET=-10+8之后不应该是-2吗?
这需要我们知道CPU取指令后IP的变化,当取指完成后,IP实际上是自动累加指令长度的,所以此时IP=8+2=10,当指令执行完成后,开始跳转时就产生了跳转cs:0000的情况(如有错误,请指正)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-3-4 17:31:54 | 显示全部楼层
重点应该是当执行到 mov cs:[di],ax处时,就是将s2的内容加载到s处,就成了s: jmp short s1 ,而jmp short s1这条指令就是向上回溯7个字节,于是从s处回溯7个字节就刚好回垤了mov ax,4c00h,int 21h处,顺利退出程序
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-3-16 19:28:37 | 显示全部楼层
没看懂啊,有没有大佬讲详细一点~~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-12-2 19:11:34 | 显示全部楼层
应该是:cpu读取指令后,IP会立马增加读取指令机器码的字节长度。然后就是楼上大佬讲解的那样往前跳10字节就回到IP:0000 的位置处执行正常退出流程。应该是这样,hhh
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-12-2 19:12:31 | 显示全部楼层
montage_qchen 发表于 2022-12-2 19:11
应该是:cpu读取指令后,IP会立马增加读取指令机器码的字节长度。然后就是楼上大佬讲解的那样往前跳10字节 ...

读取指令,IP增加相应的机器码字节长度,cpu开始处理指令。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-22 13:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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