2011-11-01 3 views
0

이 섹션에서는 완전히 혼란 스럽습니다. 나는 다른 문제에 적용하는 방법을 흡수 할 수 있도록 누군가가 나를 위해 단계로 나눌 수 있기를 바라고있는 모범 문제가있다.어셈블리 언어 서브 루틴

mc: call subr 
mr: mov [val],ax 
subr: push ax 
     push bx 
     push cx 
     add ax,dx 
     pop ax 
     pop bx 
     pop cx 
     ret 

이 책은 SP와 도끼 레지스터의 16 진수 값이 코드는 서브 루틴에서 반환하고 명령 mr: mov [val],ax에 도달 할 때이 될 것입니다 무엇을 요구합니다. sp=0100 ax=0002,하지만 나는이 답을 얻는 방법에 대한 단서가 없습니다.

명령어 mc: call subr은 스택에 다음 순차 명령어 mr: mov [val],ax의 주소를 저장하므로 서브 루틴이 올바르게 반환 될 수 있습니다. 복귀 주소가 저장된 메모리의 절대 주소는 1120E입니다. 아무도 이것을 정교하게 부탁 할 수 있습니까? subr: 반환, 제어 mr: 다시 시작합니다 그래서

registers given: 
ax = 0000 bx = 0001 cx = 0002 dx = 0004 
si = 0000 di = FFFF bp = 0080 sp = 0100 
cs = 1000 ds = 1100 es = 1110 ss = 1111 
+0

여기에 표시되는 어셈블리 언어 유형은 무엇입니까? –

답변

1

mc:에서 통화가 현재 주소를 저장합니다.

subr:은 ax, bx 및 cx 순서로 푸시합니다. 그런 다음 도끼, bx 및 cx 순서로 팝업하므로 cx에서 푸시 된 것이 도끼로 튀어 나오게됩니다 (반대의 경우도 마찬가지입니다). 이것들의 효과는 도끼와 cx를 교환하는 것입니다. add ax, dx은 생성 된 결과에 실제 영향을 미치지 않습니다. 왜냐하면 ax에 dx를 추가 한 직후에 스택에서 도끼가 튀어 나오기 때문입니다. add은 플래그에 영향을 미치지 만 여기서는 플래그를 기반으로하는 것이 없으므로 적어도 표시된 코드에서는 그다지 의미가 없습니다.

제어가 mr:으로 돌아 오면 메모리에 ax의 값을 쓴 다음 subr:으로 다시 흘러 가며 ax와 cx를 시작한 위치로 되돌립니다.

IOW,이 같은 거의 같은 효과를 달성하기 매우 느린, 로터리 방법입니다 전체 :

mc: mov [val], cx 
    ret 

는 지금까지 절대 주소가 간다, 말을 많이가 아니다. 특히 동일한 코드를 다시 실행하면 다른 주소에로드 될 가능성이 있습니다. 스택에 저장된 주소가 완전히 다를 수 있습니다.

+0

빠른 응답을 보내 주셔서 감사합니다. 나는 푸시와 팝을 더 잘 이해한다고 생각하지만, 어떤 경우에는'sp'가 변경 되었습니까? 주어진 레지스터를 보여주기 위해 원래 게시물을 업데이트 했으므로이 값으로 절대 주소를 계산하는 방법을 설명 할 수 있습니다. – raphnguyen

+0

@ graphnguyen : 절대 주소의 경우 목록에 포함되지 않은 PC 레지스터가 필요합니다. 'sp'는 스택을 밀거나 팝하는 모든 것에 의해 변경됩니다 ('call'의 함축적 인 push와'ret'의 암시적인 pop을 포함합니다). –

+0

흠. 이상하게도, 왜이 책이 5 개의 주소 그룹에서 절대 주소로 1120E를 선택했는지 궁금합니다. 그래서 3 번의'push' 호출과 3 번의'pop' 호출이 있기 때문에, 그들은 서로 취소합니다. 나는'sp'의 행동에 해당하는 섹션을 찾을 수없는 것 같습니다. 그것은 각각의 '푸시'와 함께 증가하고 '팝'마다 감소합니까? – raphnguyen