简单装配问题

时间:2017-03-25 08:20:28

标签: linux assembly nasm

我一直在靠墙撞击我的头一个多小时,我无法理解为什么以下不起作用。 如果我将b: db 1更改为b: 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

我正在使用Debian Linux和NASM。与

组装/链接
nasm -f elf64 -o test.o test.asm
gcc test.o -o test.bin

即使b为0,GDB也会显示cmp取消设置ZF,所以我在这里不知所措。

谢谢!

1 个答案:

答案 0 :(得分:4)

您已将b声明为字节:

b: db 1

但是你把它作为dword加载:

mov eax, dword [b]

这解释了为什么即使b为0也不设置零标志:因为它也加载了接下来的3个字节。

只需更改您的声明:

b: dd 1 

或者,您可以将其作为一个字节加载。