琼华 发表于 2013-4-12 11:22:26

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

本帖最后由 琼华 于 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:
13            mov cs:,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
24end start

书香 发表于 2013-4-14 09:30:51

我只做C++的 帮你顶一个

a1c2c3 发表于 2013-4-17 08:35:28

来混鱼币咯。。。。
淡定,淡定,淡定……

1971827035 发表于 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:;取cs段偏移为si的内容(也就是jmp short s1)给ax
13            mov cs:,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
24end start

韩铭铭 发表于 2013-4-17 15:12:37

还是没搞懂……

cosmos3919 发表于 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单步跟踪,相信就会明朗许多。

38299676 发表于 2016-9-2 20:39:10

其实很简单 就是 8 段 9段 原来是NOP 就是空指令,在执行的过程中 这2个字节的内存地址中的数据被覆盖,让指针指向了能正常退出的 的地址,你调试下就知道了,写这段汇编代码是下了些功夫的实在不行 就编译好 用DEBUG 单步跟踪 下 就知道了

zlliyy 发表于 2016-9-5 23:27:31

程序从start 开始执行,执行到MOV CS:,AX时将jmp short s1的机器码EBF6保存到cs:中,执行jmp short s 后跳转至S处,下一步执行MOV CS:,AX保存的机器码EBF6,EB为JMP ,F8(11111000)=-8(11111000+1取反),

理想小青年 发表于 2018-6-26 16:52:10

zlliyy 发表于 2016-9-5 23:27
程序从start 开始执行,执行到MOV CS:,AX时将jmp short s1的机器码EBF6保存到cs:中,执行jmp sho ...

这段的精髓不是jmp转移指令而是nop占用一个CPU周期与mov ax,0 int 21h中断的妙处

CHAOZHANG283 发表于 2018-9-20 19:42:08

大家可能会有疑问,F6的原码为-10,而s的偏移为8,那IP+OFFSET=-10+8之后不应该是-2吗?
这需要我们知道CPU取指令后IP的变化,当取指完成后,IP实际上是自动累加指令长度的,所以此时IP=8+2=10,当指令执行完成后,开始跳转时就产生了跳转cs:0000的情况(如有错误,请指正)

梦想飞翔的蜗牛 发表于 2019-3-4 17:31:54

重点应该是当执行到 mov cs:,ax处时,就是将s2的内容加载到s处,就成了s: jmp short s1 ,而jmp short s1这条指令就是向上回溯7个字节,于是从s处回溯7个字节就刚好回垤了mov ax,4c00h,int 21h处,顺利退出程序

飞翔的小胖子 发表于 2021-3-16 19:28:37

没看懂啊,有没有大佬讲详细一点~~~

montage_qchen 发表于 2022-12-2 19:11:34

应该是:cpu读取指令后,IP会立马增加读取指令机器码的字节长度。然后就是楼上大佬讲解的那样往前跳10字节就回到IP:0000 的位置处执行正常退出流程。应该是这样,hhh

montage_qchen 发表于 2022-12-2 19:12:31

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

读取指令,IP增加相应的机器码字节长度,cpu开始处理指令。
页: [1]
查看完整版本: 汇编语言(王爽)》(第九章、实验8分析一个奇怪的程序)看了小甲鱼老师的讲解没懂