여러 문제가 있습니다.
여기
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
을 작동시키지 않으시겠습니까? 그리고 왜 디버거를 사용하지 않습니까?
'push ax, dx' 유효한 명령입니까? – Ruben
예, "인쇄"기능이 정상적으로 작동합니다. –
'push ax, dx'는 무엇을 얻을 수 있습니까? 전에는 그런 구문을 본적이 없습니다. – zxcdw