|  |
| |
| Prox |
0xFF + 0x80 덧셈을 수행하는거 맞죠? (덧셈결과는 0x7f)
add를 수행할 때, 음수+음수=양수가 됬으므로 (0xff와 0x80은 sign-bit이 1이므로 음수, 0x7f는 양수)
overflow flag가 1이 되구요.
또 덧셈결과가 0x100보다 크므로 carry flag도 1이 됩니다 |
2011/10/24 |
|
| Prox |
헷갈리시면 of와 cf의 정의를 다시한번 검색해보세요 |
2011/10/24 |
|
| 올레 |
val1은 부호없는 바이트(BYTE)로 최대값 255고
val2는 부호있는 (SBYTE Signed BYTE)바이트 음수 최소값입니다.
양수 + 음수 연산 결과입니다. |
2011/10/24 |
|
| Prox |
올레 // 아하 질문의 의도를 알겠네요.
.DATA
val1 BYTE 255d
val2 SBYTE -128
데이터를 선언할 때 위와 같이 하셨었죠?
그러면 메모리에는
FF 80 ... ...
↑ ↑
val1 val2
이렇게 값이 들어갈겁니다... 근데...
메모리에 값이 한번 들어간 후에는, 그게 unsigned로 선언됬는지 signed로 선언됬는지는 모릅니다
왜냐하면 sbyte/byte 이런명령어들은 컴파일러(어셈블러)가 이해할수 있는 명령어일뿐
실제 컴파일된 후에도 sbyte/byte 이런 속성들이 남아있는게 아니기 때문이죠.
그래서 val1에서 1바이트를 그냥 읽어온다면, 그값은 음수로 취급하게 됩니다.
add al, val2 명령도 보면..... 단순히 al레지스터의 값과 [val2]의 값을 더하는데
al에 0xff라는 값이 들어있으므로 음수로 생각하는게 당연한 거일 거에요.
add,sub 등등 명령어 자체가, "피연산자의 sign-bit이 1이면 음수로 취급하도록" 만들어진 명령어들이기 때문이니까요. |
2011/10/25 |
|
| 올레 |
Prox//
이제 이해가 됫네요
감사합니다.
sbyte/byte명령어는 어셈블러만 이해한다는게 포인트였네요
실제레지스터에선 음수로 보는거였군요 |
2011/10/26 |
|