2016-11-20 1 views
2

누구나이 코드 조각을 도와 줄 수 있습니까? 이 경우 ptrgrades가 가리키는 값을 사용하고 4 (정수 배열)를 곱하여 ptrfreq (절대 빈도가있는 배열)의 해당 값을 증가시켜 해당 값을 업데이트하려고합니다. 하지만 % eax 값이나 % eax 값에 올바른 주소 값을 사용하는 데 문제가 있다고 생각합니다. 프로그램을 수정하려면어셈블리 IA32 :이 코드는 무엇이 문제입니까?

movl ptrgrades, %esi   # set esi pointer to grades 
    movl grades_length, %ecx  # length of vector grades 
l_freq: 
    movl ptrfreq, %edi   # reset with inital addrs of pointer 
    movl (%esi), %eax   # tmp = grades[i] 
    shll $2, %eax     # multiply grade by 4 
    addl %eax, %edi    # and add to the ptrfreq addrs 
    incl (%edi)     # freq[i]++ 
    addl $4, (%esi)    # ptrgrade++ 
    loop l_freq     # loop while ecx != 0 
+2

'addl $ 4, (% esi)'대신'addl $ 4, % esi'을 사용해보세요. 후자는'grades [i] + = 4;를하고, 앞의 것은'grades + = 4;','grades'가'int *','++ grades;'입니다. – Downvoter

답변

2
addl $4, (%esi)    # ptrgrade++ 

당신이 %esi 등록하지 %esi 포인트 메모리를 늘리려면, (그리고 주석이 코드를 반영). 이 쓰기 :

incl (%edi, %eax, 4)   # freq[i]++ 

이 방법을 당신은 또한 외부의 movl ptrfreq, %edi 명령을 이동할 수 있습니다

addl $4, %esi     # ptrgrade++ 

shll $2, %eax     # multiply grade by 4 
addl %eax, %edi    # and add to the ptrfreq addrs 
incl (%edi)     # freq[i]++ 

지침이 트리오는 단지 색인 해결을 구걸 루프 (l_freq : 레이블 이전) %edi은 더 이상 변경되지 않습니다.

관련 문제