어셈블리에서 음수 출력을 어떻게 하나요?

글쓴이: 익명 사용자 / 작성시간: 토, 2019/10/19 - 11:18오후
어셈블리를 최근에 배우기 시작하면서 eax에 있는 값을 부호 있는 10진수 정수로 출력 하는 방법을 알게 되어 아래와 같이 코딩을 하였는데 음수가 나오지 않고 다른 값이 출력됩니다.
include Irvine32.inc .data var2 SWORD -32767 .code main proc mov eax,0 add ax,var2 call WriteInt exit main endp end main
이렇게 해서 출력을 해보면 +32769가 출력이 되는데 책을 살펴보고 구글에서 대략 찾아보니 -32767이 2의 보수로 표현하면 1000 0000 0000 0001이고 컴파일러(어셈블러)는 음수로 넣은 걸 알고 있지만 막상 출력을 할 때는 음수인지 아닌지 판단하지 못하여 32769가 출력 되는 거 같습니다.
그러면 음수를 출력할 수 있는 방법은 없나요? 예를 들면 -32767을 출력하는 방법 말입니다.
부가적인 질문으로 만약에
.data var1 WORD 8000h .code mov ax,var1 <code> 라고 코딩을 하면 16진수 기준으로 msb가 8이상이니 출력은 또 양수로 하겠지만 실질적으로 var1에 음수를 할당하게 된 건가요?
Forums:
1. 음수인지 아닌지 판단하지 못한 게 아니라
1. 음수인지 아닌지 판단하지 못한 게 아니라 양수라고 판단한 겁니다.
Irvine32의 WriteInt는 eax로 받은 32비트 부호 있는 정수를 출력합니다. 이 때 부호는 eax의 MSB로 판단합니다.
이전에 eax를 0으로 초기화했기 때문에 eax의 상위 16비트는 0이지요. 따라서 부호 비트도 0입니다.
그 상황에서 ax에 var2를 더하더라도 부호 비트에 영향을 전혀 줄 수 없기 때문에 eax의 부호는 바뀌지 않습니다.
2. 부호 있는 정수를 더 큰 부호 있는 정수형으로 변환할 때는 소위 부호 확장(sign extension)을 해야 합니다.
비트 연산을 통해 직접 할 수도 있지만, x86 어셈블리를 사용중이라면 기본적으로 지원합니다: CWDE
https://c9x.me/x86/html/file_module_x86_id_27.html
고급 언어에서는 이런 경우에 자동으로 sign extension을 해 주기 때문에 이런 게 왜 필요한지도 몰랐을 거에요.
어셈블리 언어를 배워야 고급 언어들이 왜 고급 언어라고 불리는지 알게 됩니다. :)
댓글 달기