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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 15:39:03