У меня странная проблема с инструкцией MUL
на x86-64. Кажется, что инструкция неправильно умножает 64-битные данные в регистре. Я пытаюсь сделать простой код, который просто поднимает 2 до степени, определенной вызывающей стороной (передается в RDI
). Значение в RAX
, кажется, застряло на магическом пределе по некоторым причинам. Я, вероятно, снова здесь упускаю что-то очень очевидное (вероятно, неправильно поняло что-то в самой инструкции). Ниже мой код и вывод прилагается:
twotopwr:
;RDI contains the power
CALL printfcall ;this prints the good value of 10 when testing with number 10 in RDI
MOV RAX, 2;The 2 here
PUSH RBX
MOV RBX, 2;Multiplier
CMP RDI, 0;If 0 then return 1
JE ret1
loop:
;CALL printfcall
DEC RDI ;Subtract the exponent
CMP RDI, 0 ;Check if 0
JE ret ;if 0 then return the value in rax
MUL RBX ;Multiply rax by 2
;Print the rax content
PUSH RDI
MOV RDI, RAX
CALL printfcall ;Debugging print
POP RDI
JMP loop ;Again
ret1:
MOV RAX, 1;Exponent was 0
ret:
POP RBX
;return value in rax
RET
Выходы
The int is 10
The int is 4
The int is 26
The int is 28
The int is 28
The int is 28
The int is 28
The int is 28
The int is 28
The int is 28
Моя функция печати:
printfcall:;Pass in RDI
MOV RSI, RDI
PUSH RDI
MOV RDI, formatStrdec
MOV AL, 0
CALL printf
POP RDI
RET