Duntemann의 책 (제 3 판)을 읽고 방금 x86 어셈블리를 배우기 시작했습니다. Fedora 23 (64 비트)의 변형을 사용하고 있습니다. 다음은 코드입니다 :왜 AF와 SF가 설정되지 않습니까?
sandbox: sandbox.o
ld -o sandbox sandbox.o -melf_i386
sandbox.o: sandbox.asm
nasm -f elf -g -F stabs sandbox.asm -l sandbox.lst
그래서 당신은 내가 32 비트 실행 파일이 아닌 64 비트를 조립하는 치료를 촬영했습니다 볼 수 있습니다 : 다음과 같이
section .data
section .text
global _start
_start:
nop
; Put your experiments between the two nops...
mov eax,0FFFFFFFFh
mov ebx,02Dh
dec ebx
inc eax
; Put your experiments between the two nops...
nop
내 메이크입니다. 그러나 문제는 dec ebx
명령 이전에 책이 주장한 것과 반대로 AF
및 SF
플래그가 설정되어 있지 않다는 것입니다. insight
에서 프로그램을 실행하면 32 비트 레지스터가 표시되어 실행 파일이 32 비트임을 더욱 확실하게 알 수 있습니다. 다음은 gdb
으로 표시되는 상태이며 dec ebx
명령 직전의 상태입니다. 대학원 (217)에
(gdb) info reg
eax 0xffffffff -1
ecx 0x0 0
edx 0x0 0
ebx 0x2d 45
esp 0xffffce80 0xffffce80
ebp 0x0 0x0
esi 0x0 0
edi 0x0 0
eip 0x804806b 0x804806b <_start+11>
eflags 0x202 [ IF ]
cs 0x23 35
ss 0x2b 43
ds 0x2b 43
es 0x2b 43
fs 0x0 0
gs 0x0 0
Duntemann의 버전은 AF
및 SF
플래그가 설정되어 있는지 보여줍니다. 내 코드에 어떤 문제가 있습니까?
'mov'는 플래그를 설정하지 않습니다. 구글이 "intel manual 2"에 대한 영향을받는 지시와 플래그가있는 공식 문서 –