프로그래밍

 3198, 1/160 회원가입  로그인  
   올레
   어셈블리 간단한 연산

http://www.hackerschool.org/HS_Boards/zboard.php?AllArticle=true&no=3195 [복사]



오버플로우플래그와 캐리플래그가 동시에 발생가능 할까? 라는 의문으로

생각하고있는데 친구가 녀석이 발견해냈습니다.

근데 서로 왜? 인지는 모르고있네요


INCLUDE Irvine32.inc

.DATA
val1 BYTE 255d
val2 SBYTE -128

.CODE
main proc

        mov al, val1
        add al, val2

        call DumpRegs

        exit
main endp
end main

이 코드의 연산결과는 캐리플래그와 오버플로우 플래그 모두 동시에 발생하는데요

왜 그러는지 아시는분있나요?

확실한 답을 얻기 힘드네요/.....

  Hit : 5217     Date : 2011/10/20 11:23



    
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