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,0x4c00int 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
相关产品推荐
相关产品推荐

