2017-10-17 3 views
0

GDB가 값의 서명 여부를 결정하는 방법이 궁금했습니다. 서명 된 음수 값을 eax에 저장하는 작은 프로그램을 만들었습니다. 내가 디버거를 통해 그것을 실행하고, 그 부정적인 것으로 eax에서 값을 해석 것으로 나타났습니다. 어떻게 이런가? 나는 또한 디버그 정보를 생성하지 않고 이것을 시도했다. 여기 내 짧은 프로그램이 있습니다 :값이 서명 된 경우 GDB는 어떻게 알 수 있습니까?

section .text 
global _start 
_start: 
    nop 
    mov eax, [doubleWord] 
    mov ebx, 0 
    mov eax, 1 
    int 0x80 
section .data 
    doubleWord dd -52 
+1

인쇄 방법에 따라 다릅니다. 'd' (십진수)와'f' (float)가 서명되고, 나머지는'u'와'x'를 포함하여 나머지는 서명되지 않습니다. – Jester

+1

값을 해석하는 방법을 알려줍니다 (비트 자체에서 알 수있는 방법은 없습니다). – Ped7g

+0

멍청한 행운, 당신이 서명되지 않은 또는 부동 소수점을 사용하면 어떻게됩니까? 그게 맞을 것 같습니까? 아니면 그냥 10 진수 부호로 만드시겠습니까? (내 추측은 후자입니다) –

답변

1

컴파일러 생성 코드의 경우 debug info specifies the types for global symbols입니다.

디버그 정보가 없으면 gdb는 모든 것이 int이라고 가정합니다.

당신 가 할 수 손으로 코드의 디버그 정보를 자신하지만 매우 복잡하고 단지 px 명령에 대한 캐스트 또는 형식 지정자와 유형을 무시하는 것이 더 쉽다. (https://sourceware.org/gdb/current/onlinedocs/gdb/Data.html#Data)

예를 들어, p /x $eax은 EAX를 (부호없는) 16 진 정수로 인쇄합니다.

또한 layout reg이 좋습니다. 태그 위키의 하단에있는 stracegdb에 대한 추가 asm 디버깅 정보를 참조하십시오.

+1

답변 주셔서 감사합니다. EAX의 16 진수 값을 입력하려고 시도했는데 0xffffffcc를 -52로 해석했습니다. 또한 ptype은 int_32를 반환하므로 값을 부호있는 정수로 처리합니다. – user7355630