Инструкция x86-64 mul не умножается правильно? - PullRequest
1 голос
/ 23 февраля 2020

У меня странная проблема с инструкцией 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

1 Ответ

3 голосов
/ 23 февраля 2020

printf вернет количество символов, напечатанных в регистре RAX, то есть 13 после первой печати этого The int is 4, поэтому вы получаете 26 на следующей итерации, и эта итерация printf возвращает 14 как номер записанного символа, который после умножения на 2 равен 28, и это происходит снова и снова.

...