Как я могу установить начальные значения с помощью моего кода Factorial Assembly? - PullRequest
0 голосов
/ 24 сентября 2018

вот мой оригинальный код

main:    
    addi $sp, $sp, -8   # adjust stack for 2 items
    sw $ra, 4($sp)      # save return address
    sw $a0, 0($sp)      # save argument
    slti $t0, $a0, 1    # test for n<1
    beq $t0, $zero, L1
    addi $v0, $zero, 1  # if so, result is 1
    addi $sp, $sp, 8    # pop 2 items from stack
    jr $ra          # and return
L1: addi $a0, $a0, -1   # else decrement n
    jal main        # recursive call
    lw $a0, 0($sp)      # restore original n
    lw $ra, 4($sp)      # and return address
    addi $sp, $sp, 8    # pop 2 items from stack
    mul $v0, $a0, $v0   # multiply to get result
    jr $ra          # and return

Я хочу начальное значение для n!, равное n=2, $sp <= 0x0000 A0000

1 Ответ

0 голосов
/ 24 сентября 2018

Создайте отдельную функцию, которую вы вызываете из main, вместо того, чтобы сделать main самой рекурсивной.


Или используйте первый аргумент int main(int argc, char **argv) как n.

Таким образом, вы запустите свою программу с ./fac $(seq 2 4), чтобы запустить ее с $a0 = 4. Что означает int argc, char * argv []?

Команда Unix seq 2 4 печатает 2 3 4, поэтому у команды есть 3 аргумента плюс неявный первый аргумент (имя команды), таким образом, код запуска C передаст 4 в main в качестве аргумента argc.

Использование ./foo $(seq number) - удобный способ взломать рукописный asm, чтобы избежать написания int-разбор кода и запуск вашей программы с двоичным целым числом, уже находящимся в регистре (или в памяти на некоторых других платформах, например _start вместо main в x86-64 System V ABI).

...