Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Последние темы форума

Показать новые сообщения »

Почтовая рассылка

Подписчиков: 11642
Последний выпуск: 19.06.2015

Создайте subroutine (сабрутину) которая будет распечатывать 32-битную цифру в виде string

98K
08 октября 2016 года
Stack Overflow
1 / / 08.10.2016
Здраствуйте,
У меня задание создать сабрутину в отдельном файле 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


Есть идеи как можно это сделать?
Спасибо!
221
10 октября 2016 года
koderAlex
1.4K / / 07.09.2005
кнопка "вставить форматированный код" вам видна ?
push-ы и pop-ы замените на pushad и popad - листинги покороче станут .
прежде чем писать программы стоит изучить набор команд процессора .
команды преобразования из двоичного кода в двоично-десятичный вам в помощь . )

Знаете кого-то, кто может ответить? Поделитесь с ним ссылкой.

Ваш ответ

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог