Создайте subroutine (сабрутину) которая будет распечатывать 32-битную цифру в виде string
У меня задание создать сабрутину в отдельном файле prt_dec.asm, для будущего использования ее в файле main3.asm
Сабрутина в prt_dec.asm должна принимать 32-битные цифры из самого стака, и дальше обрабатывать их через while loop и делать pop в обратном порядке дабы получить число
Например, вот моя main3.asm:
%define STDIN 0
%define STDOUT 1
%define SYSCALL_EXIT 1
%define SYSCALL_READ 3
%define SYSCALL_WRITE 4
SECTION .data ; initialized data section
; extern prt_dec
lf: db 10 ; just a linefeed
msg1: db " plus "
len1 equ $ - msg1
msg2: db " minus "
len2 equ $ - msg2
msg3: db " equals "
len3 equ $ - msg3
SECTION .text ; Code section.
global _start ; let loader see entry point
extern prt_dec
_start:
mov ebx, 17
mov edx, 214123
mov edi, 2223187809
mov ebp, 1555544444
push dword 0xFFFFFFFF
call prt_dec
add esp, 4
call prt_lf
push 3413151
call prt_dec
add esp, 4
call prt_lf
; final exit
;
exit: mov EAX, SYSCALL_EXIT ; exit function
mov EBX, 0 ; exit code, 0=normal
int 080h ; ask kernel to take over
; A subroutine to print a LF, all registers are preserved
prt_lf:
push eax
push ebx
push ecx
push edx
mov eax, SYSCALL_WRITE ; write message
mov ebx, STDOUT
mov ecx, lf
mov edx, 1 ; LF is a single character
int 080h
pop edx
pop ecx
pop ebx
pop eax
ret
Как видите, эта сабрутина вводит 4294967295, потом 3413151, и 17, 214123, 2223187809, 1555544444
Происходит push и после вызывается та самая сабрутина которую мне надо написать
То, что я смог домыслить в prt_dec:
%define STDIN 0
%define STDOUT 1
%define SYSCALL_EXIT 1
%define SYSCALL_READ 3
%define SYSCALL_WRITE 4
SECTION .data ; initialized data section
global prt_dec
push eax
push edx
push ebx
push si
mov eax, SYSCALL_READ ; hz
mov ebx, 1
; тут думаю сделать while loop где смогу собрать число путем деления на десять
число % 10
например
214123 % 10 = 3 в остатке, храним его в edx
21412 % 10 = 2 в остатке храним его в edx
2141 % 10 = 1
214 % 10 = 4
21 % 10 = 1
2 % 10 = 2
0
теперь луп заканчивается, и мы видим что остатки в обратном порядке составляют нужное нам число 321412 -> 214123
for_loop:
xor edx, edx
div ebx
add, dl, '0'
push dx
cmp eax, 0
jnz for_loop
subrtn_end:
pop si
pop edx
Есть идеи как можно это сделать?
Спасибо!
push-ы и pop-ы замените на pushad и popad - листинги покороче станут .
прежде чем писать программы стоит изучить набор команд процессора .
команды преобразования из двоичного кода в двоично-десятичный вам в помощь . )