组件开关在2个字符串中的2个字符之间



我试图在一个字符串中的2个字符之间翻转,所以我buily功能可以将指针指向2个字符,然后切换。该功能可与常规的chars一起使用,但是当我将参数作为字符串中的char传递时,它开始变得疯狂并从其他地方变成chars。例如,我得到了这个字符串:

string db 'd', 'a', 'b', 'e', 'c', 0Dh, 0Ah, '$'

我想在" D"one_answers" E"之间翻转。因此,我这样做是为了将它们移至功能:

lea bx, string
lea ax, [bx] ;i use lea to get the pointer not the char
push ax
lea ax, [bx + 3]
push ax
; i know push 2 parameters.

但是从开关后的某些原因,字符串更改为:

string db 'e', 'c', 'b', 'd', 'a', 0Dh, 0Ah, '$'

因此,它成功地交换了2个字符,但是由于某种原因,该功能对他们的炭起来相同:

[bx + 1][bx + 4]。这是为什么?这是我到目前为止的代码:(打印=打印新行,print_ax_str这是在ax内打印ptr字符串的函数。

org 100h
jmp main
string db 'd', 'a', 'b', 'e', 'c', 0Dh, 0Ah, '$'
length dw 3
main:
    xor ax, ax
    xor bx, bx
    xor dx, dx
    xor cx, cx
    xor si, si
    xor bp, bp
    lea bx, string
    mov ax, bx
    print "Before string: "
    call print_ax_str
    lea ax, [bx]
    push ax
    lea ax, [bx + 3]
    push ax
    call swap ;swap the chars.
    lea ax, string
    print "After string: "
    call print_ax_str        
    jmp end        
swap:
    push cx
    push bx
    push dx
    push ax
    push bp

    mov bp, sp
    mov ax, [bp + 12]; ax = ptr char 2
    mov cx, [bp + 14]; cx = ptr char 1
    mov bx, ax
    mov ax, [bx] ;ax = char 2
    mov bx, cx
    mov dx, [bx] ;dx = char 1
    mov [bx], ax ;char 1 = char 2 

    mov bx, [bp + 12]
    mov [bx], dx ;char 2 = char 1 
    mov ax, [bx]
    mov sp, bp
    pop bp
    pop ax
    pop dx
    pop bx
    pop cx
    retn 4

end:
    mov ah, 0
    int 16h
    ret
include prints.inc

mov ax, [bx] ;ax = char 2
mov dx, [bx] ;dx = char 1
mov [bx], ax ;char 1 = char 2 
mov [bx], dx ;char 2 = char 1

您正在处理的字符串由字节组成,但是您的程序交换了单词。这就是结果关闭的原因。
作为快速修复写作:

mov al, [bx] ;AL = char 2
mov dl, [bx] ;DL = char 1
mov [bx], al ;char 1 = char 2 
mov [bx], dl ;char 2 = char 1

如果您有兴趣编写更好的程序,请重写交换过程。

  • 设置BP 在按下其他寄存器之前,以便解决参数可以使用熟悉的偏移量,例如[bp+4]作为第一个参数,而[bp+6]用于第二个参数。
  • 将参数直接移动到地址寄存器(BXSIDI),以便您可以避免大量移动事物。

新版本:

swap:
 push bp
 mov  bp, sp
 push ax
 push dx
 push si
 push di
 mov  di, [bp + 4]  ; ptr char 2
 mov  si, [bp + 6]  ; ptr char 1
 mov  dl, [di]      ; DL = char 2
 mov  al, [si]      ; AL = char 1
 mov  [si], dl      ; char 1 = char 2 
 mov  [di], al      ; char 2 = char 1 
 pop  di
 pop  si
 pop  dx
 pop  ax
 pop  bp
 retn 4

mov ax, [bx]
mov sp, bp
pop bp
pop ax

关于代码的这一部分的几个备注:

  1. 您能看到mov ax,[bx]指令后跟pop ax指令没有用吗?
  2. 您不必编写mov sp, bp指令,因为StackPointer仍指向推送寄存器。

最新更新