2013-10-30 1 views
-1

"int addarray (int n, int * array)"함수 인 x86-64 어셈블리 프로그램을 작성하려고합니다. 첫 번째 arg는 배열의 길이이고, 두 번째는 배열에 대한 포인터입니다. 배열의 요소를 더하고 반환해야합니다. 지금까지 제가 가지고있는 코드는 다음과 같습니다. 왜 작동하지 않는지 모르겠습니다.x86-64 어셈블리의 배열 요소 추가

.text 
.globl addarray 
.type addarray, @function 

addarray: 
    movq $0, %rdx 
    movq $0, %rax 
while: 
    cmpq %rdx, %rdi 
    jle afterw 

    movq %rdx, %rcx 
    imulq $8, %rcx 
    addq %rsi, %rcx 

    addq %rcx, %rax 

    addq $1, %rdx 
    jmp while 
afterw: 
    ret 
+2

"작동하지 않음"을 정의하십시오. – Michael

+0

어떤 전화 협약을 사용합니까? 나는. 어떤 레지스터에 인수가 들어 있습니까? 내 어셈블러는 약간 녹슬었지만'$ rdx'가 0으로 설정되어 있기 때문에'cpmq % rdx, % rdi jle afterw'가 즉시 afterw로 이동하지 않습니까? – dtech

답변

1

나는 AT & T 구문 실제 익숙하지 해요,하지만 당신의 라인과 같습니다

addq %rcx, %rax 

raxrcx의 값을 추가 할 예정이다. 당신은 rcx 참조, 즉 그 값을 추가 할 :
addq (%rcx), %rax 

이 적어도, 나는 그게이 & T 구문 AT에서 어떻게하는지 생각합니다. 인텔 문법에서는 다음과 같습니다

add rax,[rcx] 

은 어느 정도 일을 단축 할 수있는 간단한 최적화의 몇 가지가 있습니다,하지만 난이 위의 문제의 열쇠라고 생각합니다.