文字列内の2つの文字の間でフリップしようとしているので、私はbuily 関数を2つの文字へのポインタを取得して切り替えます。関数は正常なassmbly文字でうまく動作しますが、文字列からcharとしてパラメータを渡すと、他の場所から文字が狂ってくることがあります。例えば は、私はこの文字列を得た:アセンブリの文字列間の2文字間の切り替え
string db 'd', 'a', 'b', 'e', 'c', 0Dh, 0Ah, '$'
を、私は「D」と「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]
。 なぜですか?これは、これまでの私のコードです:(プリント= INCファイルから新しい行を印刷し、print_ax_strこれは斧内部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
単語ではなくバイトを移動します。 –
なぜ 'スワップ 'はとても目立たないのですか? argポインタがロードされると、2つのロードと2つのストア(反対側のポインタと同じレジスタの)が必要です。ああ、ポインタを非ポインタレジスタにロードしたからです。 'bx'や' si'などに読み込みます。 –
私はaxをbxに変更し、cxをsiに変更します。まだ2つの問題があります。関数swap 4 charsは2を指しますか? –