8086模拟器下获取字符串长度并实现字符串反转的代码求助
8086字符串反转功能修改实现
原代码存在的问题
- 字符存储逻辑错误:DOS 1号功能输入的字符仅存于
al寄存器,原代码使用mov [bx],ax会将无用的ah值写入内存,导致字符存储异常 - 未预留合法的字符串存储空间,直接操作
[bx]可能读写到错误内存区域 - 缺失字符串反转的核心交换逻辑
- 末尾多余
ret指令,int 21h 4c号功能已经完成程序退出,不需要额外返回
修正后可直接运行代码
include 'emu8086.inc' org 100h ; 适配com文件格式,无需手动设置段地址 ; 输出提示输入字符串长度 PRINTN 'Enter length of string' mov ah,1h int 21h sub al, '0' mov cl, al ; 存字符串长度到cx低8位 mov ch, 0 push cx ; 暂存长度后续复用 printn ; 输入字符串 print "Enter String here: " mov bx, offset str ; bx指向字符串存储首地址 p1: mov ah,1h int 21h mov [bx], al ; 仅存al中的有效字符 inc bx loop p1 printn PRINT 'inputted string : ' mov cx, [esp] ; 取出暂存的长度 mov bx, offset str output: mov dl,[bx] mov ah,2h int 21h inc bx loop output printn ; 字符串反转核心逻辑 mov si, offset str ; 头指针 mov di, offset str add di, [esp] dec di ; 尾指针 = 首地址 + 长度 -1 reverse: cmp si, di jge reverse_done ; 交换首尾字符 mov al, [si] mov bl, [di] mov [si], bl mov [di], al inc si dec di jmp reverse reverse_done: ; 输出反转后的字符串 PRINT 'reversed string : ' mov cx, [esp] mov bx, offset str output_rev: mov dl,[bx] mov ah,2h int 21h inc bx loop output_rev printn mov ax, 4c00h int 21h ; 数据区:预留20字节存储字符串,最大支持长度19 str db 20 dup(?) ; emu8086 宏定义,必须放在代码末尾 DEFINE_PRINT DEFINE_PRINTN
核心反转逻辑说明
- 用
si作为头指针指向字符串第一个字符,di作为尾指针指向字符串最后一个字符 - 每次交换两个指针指向的字符后,头指针后移、尾指针前移
- 当头指针地址大于等于尾指针地址时,所有字符交换完成,反转结束
- 当前版本默认适配1~9位长度的字符串输入,如需支持更长的多位数长度输入,可额外扩展长度输入转整数的逻辑
内容的提问来源于stack exchange,提问作者jayed bin zakir
相关产品推荐
相关产品推荐

