|
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
- -
复制代码
|
|