|
发表于 2025-3-19 09:57:23
|
显示全部楼层
你的代码存在几个问题,可能导致调试时出现 ??? 的情况。以下是一些关键问题和改进建议:
1. `mov ax, data` 需要 `mov ax, @data`
在 `start` 处,你使用了 `mov ax, data`,但 `data` 是一个段名,应该使用 `mov ax, @data` 来正确加载数据段地址。
2. `mov cs, ax` 不能直接修改 CS
在 `start` 处,你尝试 `mov cs, ax`,但 `CS` 不能直接修改。通常,代码段的地址已经由 `assume cs:code` 设定,不需要手动修改。
3. `mov al, ds:` 语法错误
在 `showbyte` 过程的 `s` 处,你写了 `mov al, ds:`,但这里缺少偏移地址,应该是 `mov al, ds:[si]`。
4. `mov es:, ah` 语法错误
在 `showbyte` 过程,你写了 `mov es:, ah`,但 `es:` 需要一个偏移地址,应该是 `mov es:[di], ah`。
5. `table` 需要放在 `code segment` 之外或使用 `db` 定义
`table db '0123456789ABCDEF'` 直接放在 `showbyte` 过程内是不正确的,应该放在 `data segment` 或 `code segment` 的合适位置。
修正后的代码示例 assume cs:code, ds:data
data segment
db 13,29,46,78,124
data ends
code segment
start:
mov ax, @data
mov ds, ax
mov si, 0
mov di, 0
mov cx, 5
call showbyte
mov ax, 4c00h
int 21h
showbyte:
push ax
push bx
push es
mov ax, 0b800h
mov es, ax
jmp short s
table db '0123456789ABCDEF'
s:
mov al, ds:[si]
mov ah, al
shr ah, 4
and al, 0Fh
mov bl, ah
mov bh, 0
mov ah, table[bx]
mov es:[di], ah
mov byte ptr es:[di+1], 2
add di, 2
mov bl, al
mov bh, 0
mov al, table[bx]
mov es:[di], al
mov byte ptr es:[di+1], 2
add di, 2
inc si
loop s
pop es
pop bx
pop ax
ret
code ends
end start
总结
- `mov ax, data` 改为 `mov ax, @data`
- 不能直接 `mov cs, ax`
- `mov al, ds:` 改为 `mov al, ds:[si]`
- `mov es:, ah` 改为 `mov es:[di], ah`
- `table` 需要正确放置
这样修改后,你的代码应该可以正确运行,并在屏幕上显示字符映射的结果。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 |
|