-1
AT & T 어셈블리에 도움이 필요합니다. I는 (16 진수 및 DEC) (제 1 * 번째) 바이트바이트를 추가하는 AT & T 어셈블리
(gdb) x/8xb &buffer_in
0x8049096: 0x03 0x02 0x10 0x27 0xe8 0x03 0x64 0x00
(gdb) x/8db &buffer_in
0x8049096: 3 2 16 39 -24 3 100 0
바이트의 첫 번째 바이트 = 번호 카운트 초 = 각 번호의 길이를 말하게 그리고, 우리가있어 아래와 같은 메모리에 어떤 데이터를로드했습니다 번호. 이 예제에서 3 개의 숫자, 각각 2 바이트, 첫 번째 숫자는 16 39이므로 1입니다. 구현에 문제가 없으며 각 바이트를 가져 와서 추가 할 수 있습니다.
질문은입니다. 왜 데이터를 메모리에로드 한 후에 십진수로 0xE8 = -24를 마비시키는 지 (아래)? 십진수로는 232이어야합니다. 데이터로드
코드는 매우 간단합니다 :
.align 32
SYSEXIT = 1
SYSREAD = 3
SYSWRITE = 4
STDOUT = 1
STDIN = 0
.bss
buffer_in: .space 10000
buffer_in_len = . - buffer_in
.text
.global _start
_start:
#STDIN READ
movl $SYSREAD, %eax
movl $STDIN, %ebx
movl $buffer_in, %ecx
movl $buffer_in_len, %edx
int $0x80
debug:
movl $0, %edi #do nothing
movl $SYSEXIT, %eax
int $0x80
@edit : -24는 dec에 대한 부호있는 0xE8 값이라는 것을 알고 있지만 서명하지 않도록하려면 어떻게해야합니까? 해당 바이트를 레지스터로 옮기고 각 숫자의 더 낮은 바이트의 현재 합계에 실제로 추가하면 232 대신에 -24가 추가됩니다. – Barcys
'x/8ub'로 인쇄 해보십시오. – fuz
BYTE 값 -24 또는 232를 추가하는 것은 똑같습니다. 합계가 잘못되면 바이트 값을 추가하는 것이 무엇을 의미하는지에 대해 잘못된 가정을하고있을 것입니다. 단일 바이트는 8 비트 만 포함 할 수 있으므로 정수 값의 경우 대개 -128 .. + 127 또는 0..255 범위를 포함 할 수 있습니다. 큰 합계를 원하면 합계에 16 또는 32 비트 값이 필요하므로 바이트 값을 같은 크기로 확장해야합니다. 0xe8을 "zero-extended"방식으로 16b로 확장하면 ('movzx가 도움이 될 수 있습니다'또는 'and'), 0x00E8 = +232가됩니다. "sign-extend"하면 ('movsx, sar, ...') 0xFFE8 = -24가됩니다. – Ped7g