Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 在汇编8086中反转字符串时出现问题_String_Assembly_Reverse_X86 16 - Fatal编程技术网

String 在汇编8086中反转字符串时出现问题

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

我需要反转汇编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字符串包含字节,但您的反向过程使用的是单词(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