2012-10-17 102 views
0

有人可以帮我找出下列程序有什么问题吗?我正在阅读“从头开始编程”,并试图将这些示例翻译成x86-64汇编。以下程序将查找一组数据中的最大数字。但是当我组装,链接和运行时,我得到了0.显然这不是最大的数字。它使用32位寄存器/指令运行正常,但不是64位。汇编程序错误结果

# PURPOSE: This program finds the largest value in a set of data. 
# 
# 
# VARIABLES: %rax holds the current value. %rdi holds the largest 
#   value. %rbx holds the current index. data_items is the 
#   actual set of data. The data is terminated with a 0. 
# 

.section .data 

data_items: 
    .long 76, 38, 10, 93, 156, 19, 73, 84, 109, 12, 21, 0 

.section .text 
.globl _start 
_start: 
    movq $0, %rbx 
    movq data_items(, %rbx, 4), %rax 
    movq %rax, %rdi 

loop_start: 
    cmpq $0, %rax      # Have we reached the end? 
    je loop_end 
    incq %rbx       # Increment the index. 
    movq data_items(, %rbx, 4), %rax # Load the next value. 
    cmpq %rdi, %rax     # Is new value larger? 
    jle loop_start 
    movq %rax, %rdi     # New val is larger, store 
             # it. 
    jmp loop_start 

loop_end: 
    # The largest value is already in %rdi and will be returned as 
    # exit status code. 
    movq $60, %rax 
    syscall 

回答

1

您正在使用movq从您的列表中移动包含32位值的64位值。这会给你错误的结果。定义你的列表来保存64位值:用.quad替换.long,并在movs中用8替换4。

+0

好的,谢谢。我认为这可能是问题,但我不知道64位值的指令是什么。在这种情况下使用movq代替movl和.long值有没有什么好处? –