String 在汇编8086中反转字符串时出现问题
我需要反转汇编8086中给定的字符串。我写了一个应该可以工作的代码,但是我得到了输出 “MAGSM$HIMI 而不是 马希米 我想不出代码有什么问题。我怀疑是“$”引起了问题,但我不知道 我的代码:String 在汇编8086中反转字符串时出现问题,string,assembly,reverse,x86-16,String,Assembly,Reverse,X86 16,我需要反转汇编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
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字符串包含字节,但您的反向过程使用的是单词(2字节)
看看这个循环,我怀疑您混合了两种解决反转问题的方法。xchgax[di]
指令说明了这一点
解决方案1使用MOV
使用XCHG
请注意,代码中的注释是错误的。递增的SI
对应于“SI++”。类似地,递减的DI
对应于“DI--”
由于将字符串的长度传递给过程并使指针基于该长度,因此循环计数器也应基于该长度,而不是通过
mov-cx,4
使用固定计数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
使用调试器查看您的代码是否移动了
$
。您只传递了9
,因此正确的反转函数将保留$
,并且只反转之前的9个字节。但是你用AX和DX而不是AL和DL进行2字节的加载/存储,所以你可能移动了它。@PeterCordes现在我得到的最后一个字符串是:'M','A','G','S','M','$','H','i',M','i'`Yup。AX和DX各为2个字节。那是你的错误。
L1:
mov dl, [si]
xchg dl, [di]
mov [si], dl
inc si ;si++
dec di ;di--
loop L1
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