Ввести имя и фамилию, вывести имя 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 раз в цикле. Код организован следующим образом:

  1. Объявлены константы:
    • times - число 10, обозначающее количество повторений цикла
    • lf - символ новой строки (10 в десятичной системе)
    • cr - символ возврата каретки (13 в десятичной системе)
    • crlf - комбинация символов новой строки и возврата каретки
  2. В начале кода подключаются две процедуры:
    • set_space - перемещает указатель на экран вправо на количество пробелов, равное символу spc, используя функцию BIOS int 29h
    • print_message - выводит сообщение на экран, используя функцию BIOS int 21h
  3. Затем определены переменные и данные:
    • message_1 и message_2 - строки, содержащие запросы на ввод имени и фамилии соответственно
    • message_3 - строка, содержащая сообщение о том, что нужно нажать любую клавишу для выхода
    • err_msg1 и err_msg2 - строки, содержащие сообщения об ошибках ввода имени и фамилии соответственно
    • max_len - константа, равная 30, обозначающая максимальную длину вводимых имен и фамилий
    • name и surname - структуры данных, содержащие информацию о введенном имени и фамилии
  4. В основной части кода выполняются следующие действия:
    • Пользователю предлагается ввести фамилию
    • Если фамилия введена, программа переходит к следующей инструкции
    • Пользователю предлагается ввести имя
    • Если имя введено, программа переходит к блоку @@:, который повторяется 10 раз
    • В каждой итерации цикла выводится имя, используя процедуру print_message, и перемещается указатель на экран вправо на количество пробелов, равное символу spc, используя процедуру set_space
  5. В конце кода определена процедура wait_for_key, которая выводит сообщение о том, что нужно нажать любую клавишу для выхода, и затем завершает программу, используя функцию BIOS int 20h

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 4.071 из 5
Похожие ответы