分析下面的程序,在运行前思考:这个程序可以正确返回吗?
运行后再思考:为什么是这种结果?
通过这个程序加深对相关内容的理解。
assume cs:codesg
codesg segment
mov ax,4c00h ;8)
int 21h ;9)
start: mov ax,0 ;1)程序由这里开始执行
s: nop ;7)此处已被改写为jmp short FLAG,而这个FLAG是多少呢?请看后面的解析。(解析2)
nop
mov di,offset s ;2)DI为S的地址偏移
mov si,offset s2 ;3)SI为S2的偏移
mov ax,cs:[si] ;4)S的地址偏移存入AX
mov cs:[di],ax ;5)S2处的汇编指令写入S处(解析1)
s0: jmp short s ;6)跳转至S
s1: mov ax,0
int 21h
mov ax,0
s2: jmp short s1
nop
codesg ends
end start
解:
本题主要是考虑对跳转指令的理解。
本题内的flag的值是这些:
start:5h
s: 8h
s0: 16h
s1: 18h
s2: 20h
那么:
(解析1)在程序被编译器编译时,标签被转换为地址,汇编转换为机器指令。那么s2:jmp short s1这句被转换为jmp short 18h-22h即EBF6(关于短转移的机器码格式请参见第178页,偏移计算方法请见180页,F6为-10的补码)。所以,实际上EBF6被复制到了s处,程序继续执行。
(解析2)程序继续执行,从s0处跳转至s处,s处目前的内容为EBF6,即跳转-10的偏移,s为8,从计算方法8位位移=标号地址-jmp指令后的第一个字节地址知道,这里的跳转是跳至jmp short s+2-10即8+2-10为0,跳转至0处执行,0处就是mov ax,4c00h。所以,程序正常执行并退出。
- [chinatree] 支持,下面或许我也需要跟上你的步伐了. 11/03 00:27
- [redhat0921] 为了玩游戏时候做外挂自己用,起来的兴趣 10/16 13:12
- [游客] 不错 10/12 16:14
- [rotapple] 哦这样,我去下载个电子书看下。 10/09 15:20
- [rotapple] 你装virtual box或者virtual machine,然后把DOS系统装到这两个软件其中之一 10/09 15:18
- [stqcw] 虚拟机也没有软盘 一运行kechengsheji2.asm就出错 因为没有软盘 09/26 14:50
- [stqcw] 我电脑上没有 软盘 我是在xp系统里面装了一个dos6.22 的虚拟机 09/26 13:36
- [chinatree] 因为多线程用的是保护模式下的Cpu,而且由windows来控制把cpu分成1个个时间段,每个线程基本 09/26 12:34
- [rotapple] 楼上的同学。。。kecheng2.asm这个我不知道是什么东西哦。是王爽老师书上的课程设计2吗? 09/26 11:11
- [rotapple] 为了了解程序设计语言的底层原理. 最早是出于对java程序中多线程的原理的疑问. ======= 09/26 11:03
[ 游客 发表于 2011-10-12 16:14 ]
不错