string - 在程序集 8086 中反转字符串时出现问题
问题描述
我需要反转程序集 8086 中的给定字符串。我编写了一个应该可以工作的代码,但我得到了输出
'MAGSM$HIMI
代替
麦格西姆
我无法弄清楚代码有什么问题。我怀疑“$”是导致问题的原因,但我不知道。
我的代码:
org 100h
jmp main
chrs db 'M','I','M','I','H','S','G','A','M', '$'
main:
mov bp, sp
mov ax,offset chrs
call print_ax_str
mov ax, offset chrs
push ax
push 9
call reverse
PRINTN ;new line
mov ax,offset chrs
call print_ax_str
jmp stop
reverse proc
; First save the old BP
push bp
; Now establish new BP
mov bp, sp
;make space for 2 local variables
sub sp, 4
mov dx, [bp+6]
mov bx, [bp+4] ;bx = 9
dec bx ;bx = 8
add dx, bx ; dx = dx + 8
mov di, dx
mov SI, [bp+6]
mov cx, 4
L1:
mov dx, [si]
xchg ax, [di]
mov [si], ax
mov [di], dx
inc si ;si--
dec di ;di++
loop L1
mov sp, bp
; Restore OLD BP
pop bp
retn 4
reverse endp
stop:
mov ah, 0
int 16h
ret
include magshimim.inc
解决方案
chrs db 'M','I','M','I','H','S','G','A','M', '$' ... L1: mov dx, [si] xchg ax, [di] mov [si], ax mov [di], dx inc si ;si-- dec di ;di++ loop L1
这里最大的问题是您的chrs字符串包含字节,但您的反转过程使用单词(2 个字节)。
看看这个循环,我怀疑你已经混合了两种解决方案来解决逆转问题。该xchg ax, [di]
指令说明了这一点。
解决方案 1 使用MOV
L1:
mov dl, [si]
mov al, [di]
mov [si], al
mov [di], dl
inc si ;si++
dec di ;di--
loop L1
解决方案2使用XCHG
L1:
mov dl, [si]
xchg dl, [di]
mov [si], dl
inc si ;si++
dec di ;di--
loop L1
请注意您的代码中的注释是错误的。递增SI
对应于“si++”。类似地递减DI
对应于“di--”。
由于您将字符串的长度传递给过程并拥有基于它的指针,因此您还应该将循环计数器基于它,而不是使用固定计数 4 via mov cx, 4
。
mov cx, [bp+4] ;SLen
shr cx, 1 ;SLen/2
L1:
通过一些额外的清理:
reverse proc
push bp
mov bp, sp
mov cx, [bp+4] ;SLen
mov si, [bp+6]
mov di, si
add di, cx
dec di
shr cx, 1 ;SLen/2
L1:
mov dl, [si]
mov al, [di]
mov [si], al
mov [di], dl
inc si ;si++
dec di ;di--
loop L1
pop bp
retn 4
reverse endp
推荐阅读
- javascript - Python Selenium - 如何检测按钮点击?
- java - 当我尝试显示图像时,我的 Image 类返回 null。我怎样才能解决这个问题?
- javascript - Next.js 受控输入不是“受控”
- java - 基于java中数据集时间块的日期保存时间范围
- python - Sum 聚合值 django ORM
- java - 检查设备上是否安装了 App 时出现空指针异常
- javascript - Node.js如何在循环中发出http get请求
- c++ - 如果栈是用链表实现的,栈的size函数的时间复杂度是多少?
- java - javax.net.ssl.SSLSession 创建时间是多少?
- swift - 如何在 SwiftUI 视图中自动反映 CoreData+iCloud 的变化?