В настоящее время я пишу сборку NASM на 64-битной машине, чтобы распечатать факториал данного ввода, а затем вернуть ввод. Программа правильно работает для распечатки факториальных значений, но возвращаемое значение не возвращает ввод. Да, код ужасен, и я не хочу, чтобы вы просто переписали его целиком. (Это моя домашняя работа.) Я просто хочу, чтобы кто-нибудь объяснил, почему мой регистр возврата (rax) НЕ сохраняет значение, которое у него было с самого начала.
extern read_input
extern print_int
call read_input
push rax ;save n
mov rcx, 1 ;counter
push rcx ;save counter
push rdi ;save print int
jmp test
print:
pop rdi
imul rdi, rcx ;multiply by current counter
push rdi ;save our multiplication factor
call print_int
pop rdi
pop rcx
pop rax ;restore trashed variables
add rcx, 1 ;increment counter by 1
push rax ;push stuff back on stack
push rcx
push rdi
jmp test
test:
cmp rcx, rax
jle print
pop rax
pop rcx
pop rdi ;clear stack
ret
Выход:
Please enter an input value:
read_input> Returning 4 (0x4)
Printing integer 1 (0x1)
Printing integer 2 (0x2)
Printing integer 6 (0x6)
Printing integer 24 (0x18)
Program complete. Return 24 (0x18)
Я хочу, чтобы он возвращал мой ввод, который в данном случае будет 4.
Любое понимание будет оценено.