Преобразование кода x86-64 в код Y86-64

Я сейчас очень смущен, когда пытаюсь различить язык ассемблера. Меня просят преобразовать следующий код x86-84 в Y86-84:

long arith(long int x, long int y, long int z) {

return (x+y+z) & (x+4+48*y);

}

В x86-64:

arith:
leaq (%rsi, %rsi, 2), %rax
salq $4, %rax
leaq 4(%rdi, %rax), %rax
addq %rdi, %rsi
addq %rdx, %rsi
andq %rsi, %rax
ret

Перед тем, как конвертировать, мне трудно понять, что происходит в x86-64. Я был бы очень признателен всем, кто мог бы рассказать мне, что происходит в этом коде.

2 ответа

Вот мой первый снимок: в Y86:

arith:
addq %rsi, %rsi
addq %rsi, %rsi
addq %rsi, %rsi
addq %rsi, %rsi
addq %rsi, %rax
addq %rsi, %rsi
addq %rsi, %rax
addq %rdi, %rax
addq 4, %rax
addq %rdi, %rsi
addq %rdx, %rsi
addq %rsi, %rax
ret

Я считаю, что строка 'addq 4, %rax' неверна. Как мне добавить 4 к значению, хранящемуся в регистре% rax?

РЕДАКТИРОВАТЬ: я вижу большую проблему в том, что после добавления в% rsi я не могу легко получить x+y+z в% rsi, как я сделал с x86. Как я могу получить x+y+z, хранящиеся в регистре тогда?

Вот мой второй снимок:

arith:
subq %r8, %r8
addq %rdi, %r8
addq %rsi, %r8
addq %rdx, %r8
addq %rsi, %rsi
addq %rsi, %rsi
addq %rsi, %rsi
addq %rsi, %rsi
subq %rax, %rax
addq %rsi, %rax
addq %rdi, %rax
addq $4, %rax
andq %r8, %rax
Другие вопросы по тегам