Я новичок в сборке, я не знаю, как преобразовать 64-битную функцию в 32-битную в 16-битную в 8-битную
Цель следующих функций - напечатать число и вернуть количество цифр в нем.
64 бит:
global print_uint64
section .text
print_uint64:
mov rax,rdi
mov rdi,10
mov rsi,rsp
while:
xor rdx ,rdx
div rdi
add rdx ,48
dec rsi
mov [rsi],dl
cmp rax ,0
jne while
mov rax,1
mov rdi,1
lea rdx,[rsp]
sub rdx,rsi
syscall
lea rax,[rsp]
sub rax,rsi
ret
this works fine
32 бит:
global print_uint32
section .text
print_uint32:
mov eax,edi
mov edi,10
mov rsi,rsp
while:
xor edx ,edx
div edi
add edx ,48
dec rsi
mov [rsi],dl
cmp eax ,0
jne while
mov eax,1
mov edi,1
lea edx,[rsp]
sub edx,esi
syscall
lea eax,[rsp]
sub eax,esi
ret
это прекрасно работает
16 бит:
global print_uint16
section .text
print_uint16:
mov ax,di
mov di,10
mov rsi,rsp
while:
xor dx ,dx
div di
add dx ,48
dec rsi
mov [rsi],dl
cmp ax ,0
jne while
mov ax,1
mov di,1
lea dx,[rsp]
sub dx,si
syscall
lea ax,[rsp]
sub ax,si
ret
но это не сработало
Я изучил некоторые вопросы о переполнении стека, касающиеся этого вопроса. Я понимаю, что не могу изменить rsp на esp, потому что esp устанавливает старшие 32 бита в ноль, поэтому, когда мы используем [] при этом доступе к памяти не выделяется этой программе, поэтому она выдает ошибку сегмента.
Мой вопрос:
1) Каковы основные c правила для преобразования 64-разрядных в 32-разрядные в 16-разрядные в 8-разрядные.