TASM汇编修改字符串输出异常、offset作用不明及汇编警告求解
问题根因分析
1. offset 运算符作用说明
offset是TASM中的地址运算符,作用是获取汇编标号对应的16位内存偏移地址,返回值是字类型(2字节)的数值。
2. 代码错误点拆解
你的代码出现乱码和汇编警告的原因完全一致,来自两个核心错误:
- 类型不匹配:你定义的
rect、line、circ都是db(字节类型)的字符串首地址,你在rect_change等分支中执行mov [bx], offset xxx时,把2字节的偏移地址写入1字节的内存空间,直接越界覆盖了后续字符串的内容,导致输出乱码,汇编警告就是提示你操作数大小不匹配。 - 逻辑错误:你需要实现的是根据条件选择不同字符串打印,完全不需要修改原字符串的内容,修改原字符串的操作属于多余的错误逻辑。
修正方案
核心调整思路
删掉所有修改原字符串的逻辑,改为在条件分支中直接给dx寄存器赋值对应要打印的字符串偏移地址,打印分支直接调用int 21h输出即可。
修正后核心代码
.model small .data X db 0 Y db 0 var0 db 0 rect db "out rect",13,10,"$" rect_plus db "in rect",13,10,"$" line db "under line",13,10,"$" line_plus db "above line",13,10,"$" circ db "out circ",13,10,"$" circ_plus db "in circ",13,10,"$" .code main: mov ax, @data mov ds, ax jmp input input: ; 你的输入逻辑保留 jmp rect_check1 rect_check1: ; 你的判断逻辑保留 jb rect_check2 ; 不符合in rect条件,打印out rect mov dx, offset rect jmp rect_print rect_check2: ; 你的判断逻辑保留 jb rect_change ; 不符合in rect条件,打印out rect mov dx, offset rect jmp rect_print rect_change: ; 符合in rect条件,直接给dx赋值对应字符串偏移 mov dx, offset rect_plus jmp rect_print rect_print: ; 不需要再给dx赋值,直接调用输出中断 mov ah, 09h int 21h jmp line_check line_check: ; 你的判断逻辑保留 jb line_change ; 不符合above line条件,打印under line mov dx, offset line jmp line_print line_change: ; 符合above line条件,赋值对应偏移 mov dx, offset line_plus jmp line_print line_print: mov ah, 09h int 21h jmp circ_check circ_check: ; 你的判断逻辑保留 jb circ_change ; 不符合in circ条件,打印out circ mov dx, offset circ jmp circ_print circ_change: ; 符合in circ条件,赋值对应偏移 mov dx, offset circ_plus jmp circ_print circ_print: mov ah, 09h int 21h jmp quit quit: mov ax, 4c00h int 21h end main
效果验证
修改后编译不会再出现类型不匹配的警告,运行后会根据你的判断逻辑输出对应字符串,不会再出现乱码问题。如果你需要固定输出你给出的预期结果,只需要调整判断条件让rect_change、line、circ分支生效即可。
内容的提问来源于stack exchange,提问作者Mikhail Beliy
相关产品推荐
相关产品推荐

