Ввести имя и фамилию, вывести имя 10 раз в цикле - Assembler
Формулировка задачи:
Доброе утро, прошу помощи в связи с тем, что ни капли не понимаю в ассемблере а сегодня зачет.
Задали простенькую программу, помогите сделать.
Ввести фамилию и имя вывести имя 10 раз в цикле
Решение задачи: «Ввести имя и фамилию, вывести имя 10 раз в цикле»
textual
Листинг программы
;***************************************************************************; ; InputSNAndLoopN10T ; ;***************************************************************************; ; ; ; Description: ; ; The program asks you to enter: surname, name, and then print the name ; ; ten times in a loop. ; ; ; ; Target OS: ; ; MS-DOS (or in DOSBox, or else where). ; ; ; ; The code is written by XiloManX. ; ; Created specially for [url]http://www.cyberforum.ru[/url]. ; ; Compile with FASM. ; ; ; ; Rights of copying: is free. ; ; ; ;***************************************************************************; ;***************************************************************************; ; *** CONSTANTS AREA *** ; ;***************************************************************************; times equ 10 ; number of times. lf equ 10 ; line feed. cr equ 13 ; carette return. crlf equ cr, lf ; carette return and line feed. ;***************************************************************************; ; *** HEAD AREA *** ; ;***************************************************************************; use16 org 100h ;***************************************************************************; ; *** CODE AREA *** ; ;***************************************************************************; START: ;----------------------------; ; request for surname input. ; ;----------------------------; mov dx, message_2 call print_message mov ah, 0ah mov dx, surname int 21h cmp [surname.str_len], byte 0 je print_err_msg2 xor ah, ah mov al, byte [surname.str_len] mov bx, surname.inp_buf add bx, ax mov [bx+0], word 0a0dh mov [bx+2], word 0a0dh mov [bx+4], byte '$' call set_space mov dx, surname.inp_buf call print_message ;----------------------------; ; request for name input. ; ;----------------------------; mov dx, message_1 call print_message mov ah, 0ah mov dx, name int 21h cmp [name.str_len], byte 0 je print_err_msg1 xor ah, ah mov al, byte [name.str_len] mov bx, name.inp_buf add bx, ax mov [bx+0], word 0a0dh mov [bx+2], byte '$' mov dx, name.inp_buf mov cx, times @@: call set_space call print_message loopw @b ;----------------------------; wait_for_key: mov dx, message_3 call print_message mov ah,0 int 16h int 20h ;***************************************************************************; ; *** PROCS AREA *** ; ;***************************************************************************; set_space: mov ax, ' ' int 29h ret clear_screen: mov ax, 3 int 10h ret print_message: mov ah, 9 int 21h ret print_err_msg1: mov dx, err_msg1 jmp @f print_err_msg2: mov dx, err_msg2 @@: call clear_screen call print_message jmp wait_for_key ;***************************************************************************; ; *** DATA AREA *** ; ;***************************************************************************; message_1: db 'Enter your name:', crlf, ' ', '$' message_2: db 'Enter your surname:', crlf, ' ', '$' message_3: db crlf, 'Press any key to exit...', crlf, '$' err_msg1: db 'You did not enter your name!', crlf, '$' err_msg2: db 'You did not enter your surname!', crlf, '$' max_len = 30 virtual at name end virtual name: .max_len db max_len .str_len db 0 .inp_buf db (max_len+5) dup (?) virtual at surname end virtual surname: .max_len db max_len .str_len db 0 .inp_buf db (max_len+3) dup (?) ;***************************************************************************;
Объяснение кода листинга программы
Этот код на языке ассемблера, написанный XiloManX, запрашивает у пользователя ввод имени и фамилии, а затем выводит имя 10 раз в цикле. Код организован следующим образом:
- Объявлены константы:
times
- число 10, обозначающее количество повторений циклаlf
- символ новой строки (10 в десятичной системе)cr
- символ возврата каретки (13 в десятичной системе)crlf
- комбинация символов новой строки и возврата каретки
- В начале кода подключаются две процедуры:
set_space
- перемещает указатель на экран вправо на количество пробелов, равное символуspc
, используя функцию BIOSint 29h
print_message
- выводит сообщение на экран, используя функцию BIOSint 21h
- Затем определены переменные и данные:
message_1
иmessage_2
- строки, содержащие запросы на ввод имени и фамилии соответственноmessage_3
- строка, содержащая сообщение о том, что нужно нажать любую клавишу для выходаerr_msg1
иerr_msg2
- строки, содержащие сообщения об ошибках ввода имени и фамилии соответственноmax_len
- константа, равная 30, обозначающая максимальную длину вводимых имен и фамилийname
иsurname
- структуры данных, содержащие информацию о введенном имени и фамилии
- В основной части кода выполняются следующие действия:
- Пользователю предлагается ввести фамилию
- Если фамилия введена, программа переходит к следующей инструкции
- Пользователю предлагается ввести имя
- Если имя введено, программа переходит к блоку
@@:
, который повторяется 10 раз - В каждой итерации цикла выводится имя, используя процедуру
print_message
, и перемещается указатель на экран вправо на количество пробелов, равное символуspc
, используя процедуруset_space
- В конце кода определена процедура
wait_for_key
, которая выводит сообщение о том, что нужно нажать любую клавишу для выхода, и затем завершает программу, используя функцию BIOSint 20h
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д