2012-10-17 4 views
0

다음 프로그램에 무엇이 잘못 되었나요? "Programming from the Ground Up"을 읽고 예제를 x86-64 어셈블리로 변환하려고합니다. 다음 프로그램은 일련의 데이터에서 가장 큰 숫자를 찾습니다. 하지만 조립하고 링크하고 실행할 때 나는 0이됩니다. 분명히 가장 큰 숫자는 아닙니다. 64 비트가 아니라 32 비트 레지스터/명령어로 잘 실행됩니다.조립 프로그램에서 잘못된 결과가 발생했습니다

# 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

32 비트 값이 포함 된 목록에서 64 비트 값을 이동하는 movq를 사용하고 있습니다. 그것은 당신에게 잘못된 결과를 줄 것입니다. 64 비트 값을 대신 보유하도록 목록을 정의하십시오. .lad를 .quad로 대체하고 movs에서 4를 8로 대체하십시오.

+0

알겠습니다. 감사합니다. 그게 문제라고 생각했는데 64 비트 값에 대한 지시어가 뭔지 몰랐습니다. 이 상황에서 .long 값을 가진 movl 대신 movq를 사용하면 어떤 이점이 있습니까? –