|
主题 : : 实验8 一个奇怪的程序 [待解决] |
回复[ 6次 ]
点击[ 573次 ] | |
|
|
|
|
[帖 主]
[ 发表时间:2010-10-23 10:01 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2009-09-25 21:54 |
assume cs:code
code segment
mov ax,4c00H
int 21h
start: mov ax,0
s: nop IP=0008 jmp short s1把这个复制到0008处执行下一步,IP为0010但是jmp short s1的机器码为E8F6 F6取反加上为-10 IP为0010+ F6的值=0000
nop
mov di,offset s s 的偏移给di是0008
mov si,offset s2 s2的偏移给si是0020
mov ax,cs:[si]
mov cs:[di],ax 目的是将s2的数据移到s处
s0:jmp short s 跳转到s处。但是跳转。是CPU来执行的,CPU先将IP移动下一步也就是mov,ax,0处然后缓冲器里的机器码,也就是JMP short s的机器码E8F0 因向上跳转,所以取反加1为-10
而mov ax,0IP是18所以jmp跳到0008处偏移
s1:mov ax,0
int 21h
mov ax,0
s2:jmp short s1
nop
code ends
end start
这个程序告诉我们。跳转不是看的是数值,而是看的JMP机器码,以及下一步所执行的IP,两者相加
得来的。不知道我说的对不对,请大家指点。 | | |
|
|
|
|
[第1楼]
[ 回复时间:2010-10-23 10:08 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2009-09-25 21:54 |
不是向上跳转就是取反取负,而是编译程序根据两点间的距离算出位移量。就是程序下一步IP的值,加上JMP所对应的机器码的值 | | |
|
|
|
|
[第2楼]
[ 回复时间:2010-10-23 10:23 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2009-09-25 21:54 |
不知道为什么,看别人的注解是越看越不明白,自己做了,才明白了点。 | | |
|
|
|
|
[第3楼]
[ 回复时间:2010-12-13 13:48 ]
[引用]
[回复]
[ top ] | |
荣誉值:2
信誉值:0
注册日期:2010-12-03 12:08 |
|
|
|
|
|
[第4楼]
[ 回复时间:2010-12-13 15:12 ]
[引用]
[回复]
[ top ] | |
荣誉值:2
信誉值:0
注册日期:2010-12-03 12:08 |
8位位移=标号处地址-JMP指令后第一字节地址
s2: jmp short s1这条机器指令为什么是EBF6是向上移10个???
不是向上移4个字节吗?
0C5E:0005 B80000 MOV AX,0000
0C5E:0008 90 NOP
0C5E:0009 90 NOP
0C5E:000A BF0800 MOV DI,0008
0C5E:000D BE2000 MOV SI,0020
0C5E:0010 2E CS:
0C5E:0011 8B04 MOV AX,[SI]
0C5E:0013 2E CS:
0C5E:0014 8905 MOV [DI],AX
0C5E:0016 EBF0 JMP 0008
0C5E:0018 B80000 MOV AX,0000
0C5E:001B CD21 INT 21
0C5E:001D B80000 MOV AX,0000
0C5E:0020 EBF6 JMP 0018
0C5E:0022 90 NOP
0C5E:0023 83C406 ADD SP,+06 | | |
|
|
|
|
[第5楼]
[ 回复时间:2011-01-02 14:45 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2011-01-02 12:34 |
//一个奇怪程序的代码
assume cs:code
code segment
mov ax,4c00h
int 21h
start:
mov ax,0
s:nop ;IP=0008
nop ; IP=0009
mov di,offset s ;IP=000A
mov si,offset s2
mov ax,cs:[si]
mov cs:[di],ax
s0:jmp short s ; 8位位移=标号处地址-JMP指令后第一字节地址 (IP)=(IP)+8位位移
;8位位移=0008-0018=-10=F6
; NOP 为空指令 所以执行时跳过 则IP=000A
;IP=000A+F6=0000
s1:mov ax,0 ;IP=0018
int 21h
mov ax,0
s2:jmp short s1
nop
code ends
end start
刚开始学汇编,上面的观点纯属个人理解,供大家参考 | | |
|
|
|
|
[第6楼]
[ 回复时间:2011-01-19 15:54 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-12-07 10:41 |
4楼你的想法是对的,但是在十六进制中 0022-0018不等于4,而是等于10,所以最后IP等于0 | | |