Вывод символов таблицы ASCII в указанном диапазоне (программа выводит только один символ) - Assembler
Формулировка задачи:
.model small org 100h .data dbStart db 10,13,'enter start index:$' dbStop db 10,13,'enter stop index:$' .code MOV AX,@DATA MOV DS,AX start: lea dx,dbStart call inpnum push di lea dx,dbStop call inpnum mov al,13 mov ah,2 mov dl,al int 21h mov al,10 mov ah,2 mov dl,al int 21h pop ax @@00: mov ah,2 mov dl,al int 21h inc ax cmp ax,di jbe @@00 xor ax,ax int 16h ret inpNum: mov ah,09 int 21h xor di,di mov bx,10 @@01: xor ax,ax int 16h cmp al,13 jz stop cmp al,'0' jb @@01 cmp al,'9' ja @@01 mov ah,2 mov dl,al int 21h and ax,0fh xchg ax,di xor dx,dx mul bx add di,ax jmp @@01 stop: ret end start
Решение задачи: «Вывод символов таблицы ASCII в указанном диапазоне (программа выводит только один символ)»
.model tiny org 100h ;.data .code org 100h start: ;MOV AX,@DATA ; MOV DS,AX ; вводим число(1) ====================================== mov ah,9 ; mov dx,offset dbStart ; int 21h ; call inpNum ; ; обрабатываем ошибку ================================== or di,di ; DI равен нулю? jnz ok ; нет - ОК! clear: ; да - ошибка! mov ah,9 ; mov dx,offset error ; int 21h ; jmp start ; заново... ; вводим число(2) ====================================== ok: ; push di ; сохраняем число(1) mov ah,9 ; mov dx,offset dbStart ; int 21h ; call inpNum ; push di ; сохраняем число(2) mov ah,9 ; mov dx,offset crlf ; перевод строки.. int 21h ; ; расчёт символов для вывода =========================== pop cx bx ; снимаем со-стека оба числа sub cx,bx ; разница будет счётчиком jns next ; второе число меньше первого? jmp clear ; да - ошибка! ; вывод ASCII символов ================================= next: ; mov al,bl ; число(1) отправляем в символ @b: ; int 29h ; выводим его на экран inc al ; сл.символ СХ-раз.. loop @b ; exit: ; xor ax,ax ; int 16h ; int 20h ; ;******************************************************* inpNum: xor di,di mov bx,10 @@: xor ax,ax int 16h cmp al,13 jz stop cmp al,'0' jb @@ cmp al,'9' ja @@ int 29h and ax,0fh xchg ax,di xor dx,dx mul bx add di,ax jmp @@ stop: ret dbStart db 10,13,'Start index: $' dbStop db 10,13,' Stop index: $' error db 13,10,7,'<--Bad index! Press any key..' crlf db 13,10,'$' end start
Объяснение кода листинга программы
[1] .model tiny [2] org 100h [3] .data [4] .code [5] org 100h [6] start: [7] mov ah,9 [8] mov dx,offset dbStart [9] int 21h [10] call inpNum [11] or di,di [12] jnz clear [13] mov ah,9 [14] mov dx,offset error [15] int 21h [16] jmp start [17] [18] ok: [19] push di [20] mov ah,9 [21] mov dx,offset dbStart [22] int 21h [23] call inpNum [24] push di [25] mov ah,9 [26] mov dx,offset crlf [27] int 21h [28] [29] pop cx bx [30] sub cx,bx [31] jns next [32] jmp clear [33] [34] next: [35] mov al,bl [36] int 29h [37] inc al [38] loop next [39] [40] exit: [41] xor ax,ax [42] int 16h [43] int 20h [44] [45] inpNum: [46] xor di,di [47] mov bx,10 [48] @@: [49] xor ax,ax [50] int 16h [51] cmp al,13 [52] jz stop [53] cmp al,'0' [54] jb @@ [55] cmp al,'9' [56] ja @@ [57] int 29h [58] and ax,0fh [59] xchg ax,di [60] xor dx,dx [61] mul bx [62] add di,ax [63] jmp @@ [64] stop: [65] ret [66] [67] dbStart db 10,13,'Start index: $' [68] dbStop db 10,13,' Stop index: $' [69] error db 13,10,7,'<--Bad index! Press any key..' [70] crlf db 13,10,'$' [71] end start
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д