2016-10-16 11 views
0

私のプログラムで私は2参照された値の間で交換しようとしていますが、私はSIレジスタを使用せずにスタックから最初のパラメータを逆参照する問題があるようです。アセンブリ8086:参照でパラメータ値をスワップ

私を助けてもらえますか?申し訳ありませんがmisknowladge、私はちょうど初心者です。 call swap

jmp main 

toSwap1  db 'a' 
toSwap2  db 'b' 

main: 


lea si,toSwap1 
push si 
lea si,toSwap2 
push si 
call swap 

mov ah,0 
int 16 
ret 




swap proc 
push bp     
mov bp,sp 

mov si,bp+4 ;second param address 
mov ax,[si] ;second param value 


mov bx,[bp+6] ;address of firstparam 
mov dx,ds:[bx] ;first param value 


mov sp,bp 
pop bp  


retn 4 ;takes 2 parameters 

swap endp 
+0

2つの値をロードするだけで、メモリに書き戻すのを忘れました。あなたの問題が「si」であるかどうかは分かりません。 – Jester

+0

@jester現在、私の問題は2番目のパラメータの値を逆参照しています。何が間違っていますか? –

+0

私が知る限り、コードは '[bp + 4]'の括弧がないこと以外は問題ありません。あなたが必要とするのは、スワップされた結果を書き戻すことです。つまり、あなたは 'mov [si]、dx; mov [bx]、ax'。 – Jester

答えて

0

あなたは何とかオペレーティングシステム、または他のCPUへの出口は、壊滅的な結果で、再実行スワップ機能に進める必要があります。

16ビットメモリモデルを仮定し、何を交換したいことは、あなたのswap関数の内部で何をしたいのか(db 'a'db 'b'により判断)バイト、であると仮定すると、このようなものです:

mov si,[bp+4] 
mov di,[bp+6] 
mov al,[si] 
mov ah,[di] 
mov [si],ah 
mov [di],al 

今後の参考として:「問題があるようですが」問題の適切な説明ではありません。 a)正確に何が起こっていると思うか、b)正確に何が起こるかを説明してみてください。

+0

申し訳ありませんが、あなたのソリューションは動作していないようです。 –

+0

コメントのおかげで、編集されました。 –

+0

まあ、私は "これのようなもの"を書いた。それをちょっと微調整する必要があるかもしれません。たとえば、パラメータがbp + 4とbp + 6であると仮定しているので、私は同じオフセットを使用しています。頭の上から正しいオフセットがあるかどうかはわかりません。しかし、いずれにせよ、それは魔法ではない、あなたはそれがどのように動作するかを理解するはずです。私はあなたに進める正しい方向を教えています。 –

関連する問題