首页 > 解决方案 > 在程序集 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

标签: stringassemblyreversex86-16

解决方案


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

推荐阅读