|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
assume cs:abc
abc segment
dw 0123H,0456H,0789H,0abcH,0defH,0fedH,0cbaH,0987H
mov bx, 0
mov ax, 0
mov cx, 8
s:add ax,cs:[bx]
add bx, 2
loop s
mov ax, 4c00H
int 21H
abc ends
end
现在可以理解DW 后面的8个16进制数据从CS段的0偏移开始申请位置,8个数据占了16字节的位置,
那么MOV bx, 0应该是从 CS:10开始的
debug中-U CS:10 可以查看到
MOV BX,0000
MOV AX,0000
.
.
.
等等
但是如果我-U CS:F的时候理论上应该是F之后显示CS:10的内容也就是mov bx,0啊
实际上查看到的是
CS:000F 09BB0000 OR [BP+DI+0000],DI
CS:0013 B80000 MOV AX,0000
他直接跳过CS:10从13开始显示的,这个是什么原理呢?求大佬解惑!
在汇编程序加载到内存后,数据区和代码区是连续存放的。你的程序布局如下:
- 偏移地址 内容(十六进制) 说明
- 0000H: 23 01 ; 0123H(数据)
- 0002H: 56 04 ; 0456H(数据)
- ...
- 000EH: 87 09 ; 0987H(数据)
- 000FH: 09 ; 数据最后一个字节
- 0010H: BB 00 00 ; mov bx,0 的机器码
- 0013H: B8 00 00 ; mov ax,0 的机器码
复制代码
关键问题分析:
1. 当执行 `-u cs:f` 时,DEBUG 从偏移地址 0FH 开始反汇编
2. 0FH 处的字节是 09H(来自数据 0987H 的高字节)
3. 09H 是 OR r/m16, r16 指令的操作码
4. DEBUG 将后续字节误解释为:
- 09H (操作码)
- BBH (ModR/M 字节)
- 00H 00H (立即数)
5. 这导致 DEBUG 错误地显示为 OR [bp+di], di(占4字节)
实际代码从 0010H 开始:
- 0010H: BB 00 00 → mov bx,0
- 0013H: B8 00 00 → mov ax,0
复制代码
原因总结:
DEBUG 的反汇编器无法区分数据和代码,当从数据区内部(0FH)开始反汇编时,会将数据字节错误解释为指令,导致显示错位。正确做法是直接从代码起始地址反汇编:
-u cs:10
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
|
|