You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 20:45:08