|
发表于 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 小助理,如未能正确解答您的问题,请继续追问。 |
|