Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
2
Добавлен:
18.10.2022
Размер:
4.09 Кб
Скачать
SECTION .bss
numK resd 4 ;объявляем число К (4 байт)
numKLen resd 1 ;длина строки К
numN resb 10 ;объявляем число N (10 байт)
numNLen resd 1 ; длина строки N
numNint resd 1

SECTION .data
num_K db "Введите число K: "
num_K_len equ $-num_K
num_N db "Введите число N: "
num_N_len equ $-num_N


SECTION .text
GLOBAL _start
_start:
mov eax, 4 ; номер системного вызовв write
mov ebx, 1 ; дескриптор 1 = STDOUT
mov ecx, num_K ;указываем адрес выводимой строки
mov edx, num_K_len ;указываем длину выводимой строки
int 80h ;вызываем ядро OC

mov eax, 3 ; номер системного вызова 'read'
mov ebx, 0 ; дескриптор 0 = STDIN
mov ecx, numK ; указатель адреса буфера
mov edx, 10 ; размер буфера
int 80h ;вызываем ядро OC

mov [numKLen], eax ; сохраняем количество введенных пользователем символов

mov eax, 4
mov ebx, 1
mov ecx, num_N
mov edx, num_N_len
int 80h

mov eax, 3
mov ebx, 0
mov ecx, numN
mov edx, 10
int 80h

dec eax ;увеличиваем eax на 1
mov [numNLen], eax ; сохраняем количество введенных пользователем символов

.get_num:
mov esi, numN ; помещаем в ESI адрес строки с числом
xor ebx, ebx ; обнуляем EBX - после преобразования в этом регистре будет содержаться наше число
xor ecx, ecx ; обнуляем ECX - после преобразования в этом регистре будет содержаться наше число
mov edx, [numNLen] ; помещаем в EDX длину выводимой строки

.next_char:
movzx eax, byte [esi] ; помещаем текущий символ строки в EAX
sub eax, '0' ; выполняем преобразование символа в цифру, путем вычитания из ASCII-кода символа строки ASCII-код нуля11
imul ebx, 10 ; умножаем EBX на 10, таким образом обеспечиваем увеличение разряда
add ebx, eax ; прибавляем к числу преобразованную цифру
inc ecx ; увеличиваем на 1 счетчик цикла
inc esi ; увеличиваем на 1 адрес, таким образом выполняем переход к следующему символу в строке
cmp ecx, edx ; сравниваем значение счетчиков
jb .next_char ; если ECX < EDX, то переходим по метке .next_char к следующему символу строки
mov [numNint], ebx ; помещаем полученное (преобразованное) число в память по адресу numNint

mov ecx, [numNint] ;помещаем в регистр ECX numNint

.repeat:
mov [numNint], ecx

mov eax, 4 ;возов системного вызова write
mov ebx, 1 ; дискриптор 1 stdout
mov ecx, numK ;указываем вдрес выводимой строки
mov edx, [numKLen] ;указываем длину строки
int 80h ;вызываем ядро OC

mov ecx, [numNint] ;помещаем в регистр ECX numNint
loop .repeat ;loop уменьшает значение счётчика на еденицу

.end:
mov eax, 1 ; номер системного вызова 'exit'
mov ebx, 0 ; код завершения программы
int 80h ; вызов ядра ОС
Соседние файлы в папке новая папка