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

NASM环境下8086汇编如何拼接字符串,现有代码报错如何解决

NASM 8086架构字符串拼接问题排查与实现

原有代码错误点

  • 语法不兼容NASM:你混用了MASM的@data、段寄存器关联语法,NASM不支持该写法;同时你加了[org 0x100]说明是要生成DOS下的.com格式程序,这类程序本身不需要单独定义data、code段,所有代码和数据共享同一段空间,分段声明反而会触发data redefined类报错。
  • 非法指令:mov ah, 后未写操作数,属于语法错误,直接触发instruction expected报错。
  • 逻辑错误:字符串是内存中连续的字节序列,不能通过对寄存器做加法实现拼接,需要逐字节复制到目标缓冲区完成拼接操作。
  • 中断调用不符合规范:DOS int 0x21的0x09号输出功能要求ds:dx指向待输出字符串的首地址,你将数据存入8位寄存器dh完全不符合调用要求,且lea dh,ah属于非法指令,lea指令仅支持取内存地址,不能作用于通用寄存器。
  • 执行逻辑错误:程序退出指令mov ax,0x4c00 int 0x21写在了code段声明之外,不会被正常执行。
  • 字符串格式错误:你给两个源字符串末尾都加了DOS字符串结束符$,拼接时会提前截断第一个字符串,无法得到正确结果。

正确实现代码

以下代码为NASM语法的8086兼容.com程序,可直接编译运行,实现两个字符串拼接后输出:

[org 0x100]

; 数据定义
fn db 'Atul', 0   ; 第一个字符串,以0作为结束标记,不带$
ln db 'Dagur', 0  ; 第二个字符串,以0作为结束标记
buf resb 100      ; 预留100字节的缓冲区用于存储拼接后的字符串

start:
    ; 第一步:复制第一个字符串到缓冲区
    mov si, fn
    mov di, buf
copy_fn:
    mov al, [si]
    cmp al, 0
    je copy_ln_start
    mov [di], al
    inc si
    inc di
    jmp copy_fn

copy_ln_start:
    ; 第二步:复制第二个字符串到缓冲区末尾
    mov si, ln
copy_ln:
    mov al, [si]
    cmp al, 0
    je add_end_flag
    mov [di], al
    inc si
    inc di
    jmp copy_ln

add_end_flag:
    ; 第三步:给拼接后的字符串加DOS结束符$
    mov byte [di], '$'

    ; 输出拼接后的字符串
    mov dx, buf
    mov ah, 0x09
    int 0x21

    ; 程序正常退出
    mov ax, 0x4c00
    int 0x21

编译运行方式

用NASM编译为.com程序:nasm -f bin concat.asm -o concat.com,编译完成后可在DOSBox等8086模拟环境下直接运行。

内容的提问来源于stack exchange,提问作者divisibility rules 265000 m i

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.17 08:45:03