汇编语言(王爽)》(第九章、实验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
我只做C++的 帮你顶一个 来混鱼币咯。。。。
淡定,淡定,淡定…… 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 还是没搞懂…… 没那么复杂,这里考得就是个”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单步跟踪,相信就会明朗许多。 其实很简单 就是 8 段 9段 原来是NOP 就是空指令,在执行的过程中 这2个字节的内存地址中的数据被覆盖,让指针指向了能正常退出的 的地址,你调试下就知道了,写这段汇编代码是下了些功夫的实在不行 就编译好 用DEBUG 单步跟踪 下 就知道了 程序从start 开始执行,执行到MOV CS:,AX时将jmp short s1的机器码EBF6保存到cs:中,执行jmp short s 后跳转至S处,下一步执行MOV CS:,AX保存的机器码EBF6,EB为JMP ,F8(11111000)=-8(11111000+1取反), 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中断的妙处 大家可能会有疑问,F6的原码为-10,而s的偏移为8,那IP+OFFSET=-10+8之后不应该是-2吗?
这需要我们知道CPU取指令后IP的变化,当取指完成后,IP实际上是自动累加指令长度的,所以此时IP=8+2=10,当指令执行完成后,开始跳转时就产生了跳转cs:0000的情况(如有错误,请指正) 重点应该是当执行到 mov cs:,ax处时,就是将s2的内容加载到s处,就成了s: jmp short s1 ,而jmp short s1这条指令就是向上回溯7个字节,于是从s处回溯7个字节就刚好回垤了mov ax,4c00h,int 21h处,顺利退出程序 没看懂啊,有没有大佬讲详细一点~~~ 应该是:cpu读取指令后,IP会立马增加读取指令机器码的字节长度。然后就是楼上大佬讲解的那样往前跳10字节就回到IP:0000 的位置处执行正常退出流程。应该是这样,hhh montage_qchen 发表于 2022-12-2 19:11
应该是:cpu读取指令后,IP会立马增加读取指令机器码的字节长度。然后就是楼上大佬讲解的那样往前跳10字节 ...
读取指令,IP增加相应的机器码字节长度,cpu开始处理指令。
页:
[1]