2017-03-14 3 views
1

어셈블리에 새로운 브랜드는 부호없는 산술에 대한 도움이 필요합니다. C 프로그램에서 변환한다는 것은 무엇이든 의미합니다.어셈블리의 부호없는 정수

사용 :

리눅스를

NASM

86 (32 비트) I는 사용자의 숫자에 읽고 싶은

. 나는이 번호를 서명하지 않기를 바란다. 부호있는 정수 제한을 초과하는 숫자를 입력하고 정보 레지스터를 사용할 때 레지스터를 저장하는 레지스터가 음수라는 것은 오버플로가 발생했음을 의미합니다. (분명히 입력 한 숫자는 최대 unsigned int보다 작습니다.)이 레지스터를 부호없는 것으로서 어떻게 처리 할 수 ​​있습니까? 비교를 수행하고 결과에 따라 점프 할 수 있습니까?

답변

2

어셈블리에는 서명 된 형식과 서명되지 않은 형식이 없습니다. 레지스터는 사용자가 보는 방법에 따라 부호가 있거나 부호가없는 값을 보유합니다.

는 (등 jg, jl) 서명 해석과 일치 지침과 서명되지 않은 해석 (ja, jb 등) cmp 명령은 모두를 위해 작동과 일치하는 지침이다 -이 플래그를 설정하는 서명 된 해석에 따라 점프하려면 jl과 같은 명령어로, 부호없는 해석을 기반으로 점프하려면 jb과 같은 명령어로 사용할 수있는 플래그로 사용할 수 있습니다. 사용하지 않는 플래그는 무시합니다.

그래서 "내 레지스터를 저장하는 것이 부정적입니다"라고 말하면 그건 말도 안됩니다. 그런 식으로 해석하는 경우에만 음수로 나타날 수 있습니다.

+0

(gdb에서) 정보 레지스터 대신 서명되지 않은 것으로 표시하는 방법이 있습니까? – frillybob

+1

캐스트가 작동해야합니다 :'print (unsigned) $ eax'. 아니면'print/u' –

+0

...'info registers'가 조금 덜 유연 해 보입니다. 나는 그것의 명백한 등가물이 보이지 않는다. –