2012-05-27 4 views
-1

IP 레지스터의 내용을 인쇄해야합니다. (a86).IP 레지스터의 내용 표시

int11: 
call ipp 
iret 

그리고 절차 IPP :

ipp: 
pop dx 
print dx 
ret 

그리고 기능 인쇄 :

나는 인터럽트 핸들러가

print macro 
push ax,dx 
lea dx, #1 
mov ah,9 
int 021 
pop dx,ax 

을하지만 이상한 문자를 많이 인쇄 :

Ple 뭐가 잘못 됐는지 말해줘.

P. 어셈블러에 대한 나의 지식은 매우 가난합니다.

+0

'push ax, dx' 유효한 명령입니까? – Ruben

+0

예, "인쇄"기능이 정상적으로 작동합니다. –

+0

'push ax, dx'는 무엇을 얻을 수 있습니까? 전에는 그런 구문을 본적이 없습니다. – zxcdw

답변

2

이진 값을 텍스트로 변환해야합니다. '$'로 끝나는 문자열이어야합니다. 그런 다음 해당 문자열의 주소를 dx로로드하십시오.

또한 ds가 올바른 값을 보유하고 있는지 확인해야합니다.

봐은 : http://www.delorie.com/djgpp/doc/rbinter/id/73/25.html

+0

바이너리 값을 텍스트로 변환하는 방법을 알려주시겠습니까? 나는 이해하지 못한다. .. 나의 어리석은 질문에 대해 유감스럽게 생각한다. –

+0

http://forum.codecall.net/topic/65302-assembly-string-integer-algorithms-win32-nasm/에서보세요. – Ruben

0

여러 문제가 있습니다.

여기

ipp: 
pop dx 
print dx 
ret 

당신은 pop dx와 스택에서 반환 주소를 제거합니다. ret은 반송 주소를 훔친 후에 어디에서 돌아올 것이라고 생각합니까? 왜 주소를 다시 스택에 넣지 않습니까?

또한 이와 동일한 pop dx은 ISR에 의해 중단 된 프로그램의 dx 레지스터 값을 손상시킵니다. dx을 ISR에 저장하고 복원하지 않는 이유는 무엇입니까?

또 다른 하나 ... 난 당신의 어셈블러 알고 있지만

lea dx, #1 

이상한 모양이 일치하지 않습니다. 당신이 print dx 매크로이 줄을 호출 할 때, IMO,

lea dx, dx 

로 변환하고 잘못된 x86 명령어입니다한다. 귀하의 코드가 전혀 컴파일합니까 ??? 그렇다면 어셈블러는 lea dx, dx으로 무엇을합니까? 그것은 mov dx, dx 또는 nop으로 만들지 않습니까? 아니면 제거합니까? 무시합니까?

int 21h의 함수 9는 주소가 ds:dx 인 "$"로 끝나는 ASCII 문자열을 표시하며 코드에 그러한 문자열을 구성하지 않습니다.

코드는 ds을 설정하지 않으며 단지 ds 값이 중단 된 프로그램에서 발생하는 경우를 사용하며 이는 나쁘다. 사용하려면 ds을 저장하고 복원해야합니다. ISR의 데이터가 ISR의 코드 세그먼트에 포함될 경우 cs 값을 사용하여 ds을로드하려고합니다.

그런 다음 의 오프셋은 보다 작 으면 print dx이됩니다. 값을 ip으로 인쇄 하시겠습니까? 언제 ip 값을 알고 싶습니까?

마지막으로 왜 ISR이 필요한가요?

ISR이 없으면 먼저 ipp을 작동시키지 않으시겠습니까? 그리고 왜 디버거를 사용하지 않습니까?