2016-10-16 4 views
0

내 프로그램에서 2 참조 된 값 사이의 스왑을 시도하고있어하지만 SI 레지스터를 사용하지 않고 스택의 첫 번째 매개 변수를 역 참조하는 데 문제가있는 것 같습니다.Assembly 8086 : 참조로 매개 변수 값을 스와핑

나를 도와 줄 수 있습니까? misknowladge 미안 해요, 난 그냥 초보자입니다.

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

그냥 두 값을로드 한 것이므로 메모리에 다시 쓰는 것을 잊었을 때입니다. 'si'에 어떤 문제가 있는지 잘 모르겠습니다. – Jester

+0

@jester 현재 내 문제는 두 번째 매개 변수의 값을 역 참조하는 것입니다. 내가 뭘 잘못하고있는 걸까요? –

+0

내가 알 수있는 한, 코드는'[bp + 4]'주위에 괄호가 빠져있는 것을 제외하고는 괜찮습니다. 필요한 것은 스왑 된 결과를 다시 쓰는 것입니다. 즉,'mov [si], dx; mov [bx], 도끼. – Jester

답변

0

call swap 후에는 어떻게 든 운영 체제 종료, 또는 다른 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이라고 가정하는 것처럼 보이므로 같은 오프셋을 사용하고 있습니다. 올바른 오프셋인지 여부를 기억하지 못합니다. 그러나 어쨌든 그것은 마법이 아니며 그것이 어떻게 작동하는지 이해해야합니다. 나는 당신에게 올바른 방향을 제시합니다. –