2017-03-25 1 views
1

나는 한 시간 동안 머리를 벽에 부딪쳐서 왜 아래가 작동하지 않는지 이해할 수 없다. 내가 b: db 1b: db 0에를 변경하는 경우 다음은, 10을 인쇄해야합니다 그렇지 않으면 대신 0을 인쇄해야합니다, 제가 조립을 기록하는 프로젝트를 쓰고 한 10간단한 조립 문제

프로그램은 항상 출력하고이 단위 테스트 중 하나입니다 실패하고 나는 그것을 얻지 못한다. 그것은 단순해야합니다.

extern printf, exit 

section .bss 

section .data 
b: db 1 
x: dd 5 
y: dd 5 
z: dd 0 
int_pattern: db "%i", 10, 0 

global main 

section .text 

main: 
mov eax, dword [b] 
cmp eax, dword 0 
je condition_end4 

; add x and y 
; store into z 
mov eax, dword [rel x] 
add eax, dword [rel y] 
mov [rel z], eax 

condition_end4: 

; rsi = &z 
; rdi = &int_pattern 
mov rsi, qword [z] 
mov rdi, int_pattern 
; not using vector registers 
xor rax, rax 
; printf(int_pattern, z); 
call printf 

저는 NASM과 함께 Debian Linux를 사용하고 있습니다. b이 0 인 경우

nasm -f elf64 -o test.o test.asm 
gcc test.o -o test.bin 

와 연결/조립하여도, GDB는 cmp 설정 해제 ZF 그래서 내가 여기 손실에있어 것을 알 수있다.

감사합니다. 당신은 b를 선언 한

답변

4

바이트로 :

b: db 1 

하지만 당신이 DWORD으로로드 : b는 0 인 경우에도 제로 플래그가 설정되지 않은 이유는 설명

mov eax, dword [b] 

: 때문에 다음 3 바이트도로드 중입니다.

그냥 선언을 변경합니다

b: dd 1 

다른 방법으로, 바이트로로드 할 수 있습니다.