|
5鱼币
问题标红
{
assume cs:codesg
codesg segment
mov ax,4c00h
int 21h
start: mov ax,0
s: nop
nop
mov di,offset s
mov si,offset s2
mov ax,cs:[si]
mov cs:[di],ax
s0: jmp short s
s1: mov ax,0
int 21h
mov ax,0
s2:jmp short s1
nop
codesg ends
end start
; mov di,offset s (s的偏移地址8)
; mov si,offset s2 (s2的偏移地址20)
; mov ax,cs:[si] (cs:si指向的值赋值给ax)
; mov cs:[di],ax (ax的赋值给cs:di)
;总感觉这里缺少一句,mov di,offset s 这样写的话是不是短暂的关联在一起。cs:di 表示的就是s标号
; jmp short s (回跳标号s处)
; s执行的是s2的指令 (s2的),而s2的机器编码是EBF6
;cpu不管s2处的标号s1,执行的是机器编码?
}
;源代码 assume cs:codesg
codesg segment
mov ax,4c00h
int 21h
start:
mov ax,0
s:
nop
nop
;这段代码是将 s2 处的两个字节复制到 s
;如你所说,s2处的数据是 EB F6
;执行这段代码后,s处的nop nop 就变成了 EB F6
;你说的缺少一句是什么意思?该写一句什么?
mov di,offset s
mov si,offset s2
mov ax,cs:[si]
mov cs:[di],ax
s0:
;跳转到s,这时,s处的代码已经变成了 EB F6
jmp short s
s1:
mov ax,0
int 21h
mov ax,0
s2:
jmp short s1
nop
codesg ends
end start
;这是原始的反汇编代码
;s 的地址为 0008,内容为 90 90,即 nop nop
;s2的内容为 EB F6 , 反汇编码为 JMP 0018 其中 0018为s1的地址
;再进一步看 EB F6为什么会被翻译成 JMP 0018
;因为 EB 是 JMP near 指令的二进制码,后面接一个字节的立即数,这个立即数 F6 是一个地址,
;事实上,这里的F6是个相对地址,是 JMP near 的下一条指令的相对地址。
;EB F6 的下一条指令是 NOP[90],地址为 0022,因此 EB F6 翻译成汇编代码实际应为 JMP 0022+F6
;F6换算成十进制是 -10, 再换算成带符号的十六进制是 -A 0022+F6 = 0022 - 000A = 0018
;所以 EB F6 反汇编后变成了 JMP 0018
-u
0C33:0005 B80000 MOV AX,0000
0C33:0008 90 NOP
0C33:0009 90 NOP
0C33:000A BF0800 MOV DI,0008
0C33:000D BE2000 MOV SI,0020
0C33:0010 2E CS:
0C33:0011 8B04 MOV AX,[SI]
0C33:0013 2E CS:
0C33:0014 8905 MOV [DI],AX
0C33:0016 EBF0 JMP 0008
0C33:0018 B80000 MOV AX,0000
0C33:001B CD21 INT 21
0C33:001D B80000 MOV AX,0000
0C33:0020 EBF6 JMP 0018
0C33:0022 90 NOP
0C33:0023 06 PUSH ES
0C33:0024 81F90002 CMP CX,0200
-
;下面是执行完指令MOV CS:[DI],AX 后的反汇编代码
;s 的地址为 0008,内容已经变成了EB F6,说明将成功将[s2]的内容复制到了[s]
;下面分析一下 EB F6 为什么会被翻译成 JMP 0000
;与上面的分析相同,先找 EB F6 的下一条指令的地址为 000A
;EB F6 = JMP 000A + F6 = JMP 000A - 000A = JMP 0000
-u0005
0C33:0005 B80000 MOV AX,0000
0C33:0008 EBF6 JMP 0000
0C33:000A BF0800 MOV DI,0008
0C33:000D BE2000 MOV SI,0020
0C33:0010 2E CS:
0C33:0011 8B04 MOV AX,[SI]
0C33:0013 2E CS:
0C33:0014 8905 MOV [DI],AX
0C33:0016 EBF0 JMP 0008
0C33:0018 B80000 MOV AX,0000
0C33:001B CD21 INT 21
0C33:001D B80000 MOV AX,0000
0C33:0020 EBF6 JMP 0018
0C33:0022 90 NOP
0C33:0023 06 PUSH ES
0C33:0024 81F90002 CMP CX,0200
-
|
|