클래스 실험실에서이 작업을 수행하고 있으며 잘못된 곳으로 가고 있지 않습니다. 이 프로그램은 q 대신 l을 사용하여 모든 지시 사항에 접미사를 붙이면 작동합니다 (예 : rrmovq 대신 andq, rrmovl 대신 - andl). 나는 내가 잘못하고있는 것에 대해 약간의 포인터를 정말로 고맙게 생각한다.내가 잘못하고있는 부분을 이해하려고 노력 중 - 연결된 목록의 반복적 인 요약 Y86
.pos 0
init: irmovq Stack, %rsp # Set up stack pointer
rrmovq %rsp,%rbp # Set up base pointer
irmovq ele1,%rax
pushq %rax
call sum_list # Execute main program
halt # Terminate program
# Sample linked list
.align 8
ele1: .quad 0x00a
.quad ele2
ele2: .quad 0x0b0
.quad ele3
ele3: .quad 0xc00
.quad 0
# int sum_list(list_ptr ls)
sum_list: pushq %rbp
rrmovq %rsp,%rbp
xorq %rax,%rax # val = 0
mrmovq 8(%rbp),%rdx # edx = ls
andq %rdx,%rdx # Set condition codes
je End
Loop: mrmovq (%rdx),%rcx # ecx = ls->val
addq %rcx,%rax # val += ls->val
mrmovq 4(%rdx),%rdx # ls = ls->next ------ tried +8 insetead of 4 also
andq %rdx,%rdx # Set condition codes
jne Loop
End: rrmovq %rbp,%rsp
popq %rbp
nop # makes sure stop in 31 steps
ret
# The stack starts here and grows to lower addresses
.pos 0x100
스택 :
q는 64 비트 피연산자 크기이고, l은 32 비트 피연산자 크기입니다. 목록 노드는 (포인터와 값) 두 개의 qword 멤버를 가지므로'q'가 정확해야합니다. '4 (% rdx)'는 틀린 것 같습니다 : 여러분은 값의 중간에서 4 바이트를 읽었습니까? (또는'q' 피연산자 크기의 8 바이트). 포인터와 정수가 모두 작기 때문에'l' 피연산자 크기가 작동해야합니다 (여전히 8의 오프셋을 사용하는 한). 따라서 32 비트로 자르면 값이 변경되지 않습니다. –
코드를 싱글 스텝 처리 할 수있는'y86' 디버거가 있습니까? 레지스터를 사용하여 값을 봅니다. –
나는 https://xsznix.github.io/js-y86/을 시도했는데 내 접미사가 l인데 내 접미사가 아닐 때는 내 코드가 작동한다. 한 가지 문제는 내가 렉스에 첫 번째 요소를 넣은 후 멈 추면 0xa 대신 0x0a00000000000000이 발생한다는 것입니다 (자체 좌회전이 가능할 수도 있음) –