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

익명 사용자의 이미지

어셈블리를 최근에 배우기 시작하면서 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에 음수를 할당하게 된 건가요? 
익명 사용자의 이미지

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을 해 주기 때문에 이런 게 왜 필요한지도 몰랐을 거에요.

short int short_var = -1;
long int long_var = short_var; /* 자동으로 sign extended */

어셈블리 언어를 배워야 고급 언어들이 왜 고급 언어라고 불리는지 알게 됩니다. :)

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.