Программирование на ассемблере: вариант №4 |
Автор Administrator | |
01:08:2008 г. | |
1. Составить программу, с клавиатуры вводится строка с пробелами и после нажатия Enter все слова должны выстраиваться в столбик. 2. Запишите двоичное дополнение и обратный код для двоичного числа, а также 10-чное и 16-ричное их представление: 01110001 3. Составить программу, выводящую на экран запрос на ввод двух чисел, с выводом результата их деления - целую часть и остаток в двоичном коде. 4. Составить программу, выводящую на экран некоторое сообщение, запрашивающее ввод произвольного слова, которое затем и выводится в следующей строке экрана «задом - наперёд» (пример - ремирп). 5. Составить программу, выводящую на экран запрос на цвет, рисующую затем треугольник (не прямоугольный) этого цвета произвольного расположения. 1. Листинг программы: masm .model small .model tiny .code org 100h .286 start: ;очистить экран c1: cmp a1,50 jz ec1 c2: cmp b1,80 jz ec2 mov ah,2 mov dh,a1 mov dl,b1 int 10h mov ah,02 mov bl,10h mov dl,' ' int 21h inc b1 jmp c2 ec2: inc a1 mov dl,0 mov b1,dl jmp c1 ec1: mov ah,2 mov dh,4 mov dl,15 int 10h mov ah,09h mov dx,offset mes1 int 21h mov ah,0ah ;Запрос функции ввода lea dx,F ;Загрузить адреса списка параметров int 21h ;Вызвать DOS mov ah,2 mov dh,8 mov dl,15 int 10h mov ah,09h mov dx, offset mk1 mov a,8 mov b,6 mov ah,2 mov dh,a mov dl,b int 10h inc a mov cx,50 cikl1: mov bx,50 sub bx,cx mov dl,offset GrFLD1[bx] cmp dl,' ' push dx push cx push bx jne ne1 mov ah,2 mov dh,a mov dl,5 int 10h inc a ne1: pop bx pop cx pop dx cmp dl,'$' je ne2 mov ah,02 int 21h ne2: loop cikl1 mov ah, 0; ожидание символа int 16h ret mes1 db 'Vvedite stroku<50 simvolov: ','$' mk1 db '******','$' F LABEL BYTE ;Список параметров: MAXLEN1 DB 30 ; Максимальная длина ACTLEN1 DB ? ; Реальная длина GrFLD1 DB 50 DUP ('$') ; a db 0 b db 0 a1 db 0 b1 db 0 end start Результаты работы программы: Vvedite stroku<50 simvolov: 234 hghjhjh yui 78 234 hghjhjh yui 78 2. Исходное число: 01110001 Двоичное дополнение 10001111 Десятичное представление исходного числа: 113 Десятичное представление дополнения: 143 Шестнадцатиричное представление исходного числа: 71 Шестнадцатиричное представление дополнения: 8F 3 Листинг программы: .model tiny .code org 100h .286 start: mov dx,offset mes1 mov ah,9 int 21h ; вывести приглашение ко вводу message1 ;читаем введенную строку и преводим её в 16-ное число в регистре ах mov dx,offset buffer mov ah,0Ah int 21h ; считать строку символов в буфер mov dx,offset crlf mov ah,9 int 21h ; перевод строки ; 76 перевод числа в ASCII-формате из буфера в бинарное число в АХ xor di,di ; DI = 0 - номер байта в буфере ;mov ах,0h ; АХ = 0 - текущее значение результата mov ax,0h mov cl,blength xor ch,ch xor bx,bx mov si,cx ; SI - длина буфера mov cl,10 ; CL = 10, множитель для MUL asc2hex: mov bl,byte ptr bcontents[di] sub bl,'0' ; цифра = код цифры - код символа "0", mul cx ; иначе: умножить текущий результат на 10, add ax,bx ; добавить к нему новую цифру, inc di ; 90 увеличить счетчик cmp di,si ; если счетчик+1 меньше числа символов - jb asc2hex ; продолжить (счетчик считается от 0) push ax mov dx,offset mes2 mov ah,9 int 21h ; вывести приглашение ко вводу message1 ;читаем введенную строку и преводим её в 16-ное число в регистре ах mov dx,offset buffer mov ah,0Ah int 21h ; считать строку символов в буфер mov dx,offset crlf mov ah,9 int 21h ; перевод строки ; 76 перевод числа в ASCII-формате из буфера в бинарное число в АХ xor di,di ; DI = 0 - номер байта в буфере ;mov ах,0h ; АХ = 0 - текущее значение результата mov ax,0h mov cl,blength xor ch,ch xor bx,bx mov si,cx ; SI - длина буфера mov cl,10 ; CL = 10, множитель для MUL asc2hex2: mov bl,byte ptr bcontents[di] sub bl,'0' ; цифра = код цифры - код символа "0", mul cx ; иначе: умножить текущий результат на 10, add ax,bx ; добавить к нему новую цифру, inc di ; 90 увеличить счетчик cmp di,si ; если счетчик+1 меньше числа символов - jb asc2hex2 ; продолжить (счетчик считается от 0) mov bx,ax mov dx,offset mes3 mov ah,9 int 21h pop ax div bl push ax xor ah,ah mov bx,2 xor di,di l2: xor dx,dx div bx add dl,030h dec di mov buf_end[di],dl cmp ax,00h jnz l2 lea dx,buf_end[di] mov ah,09h int 21h mov dx,offset mes4 mov ah,9 int 21h pop ax mov al,ah xor ah,ah mov bx,2 xor di,di l3: xor dx,dx div bx add dl,030h dec di mov buf_end[di],dl cmp ax,00h jnz l3 lea dx,buf_end[di] mov ah,09h int 21h e1: mov ah, 0; ожидание символа int 16h int 20 ret buf db 16 dup (?) buf_end db'$' mes1 db "Vvedite pervoe chislo: $" mes2 db "Vvedite vtoroe chislo: $" mes3 db "Celaya chst ravna: $" mes4 db " Ostatok raven: $" crlf db 0Dh,0Ah,'$' buffer db 6 ; максимальный размер буфера ввода blength db ? ; размер буфера после считывания bcontents: ; содержимое буфера располагается за ; концом СОМ-файла a dw 0 b dw 0 end start Результаты работы программы: Vvedite pervoe chislo: 23 Vvedite vtoroe chislo: 7 Celaya chst ravna: 11 Ostatok raven: 10 4. Листинг программы masm .model small .model tiny .code org 100h .286 start: ;очистить экран c1: cmp a1,50 jz ec1 c2: cmp b1,80 jz ec2 mov ah,2 mov dh,a1 mov dl,b1 int 10h mov ah,02 mov bl,10h mov dl,' ' int 21h inc b1 jmp c2 ec2: inc a1 mov dl,0 mov b1,dl jmp c1 ec1: mov ah,2 mov dh,4 mov dl,15 int 10h mov ah,09h mov dx,offset mes1 int 21h mov ah,0ah ;Запрос функции ввода lea dx,F ;Загрузить адреса списка параметров int 21h ;Вызвать DOS mov ah,2 mov dh,8 mov dl,15 int 10h mov ah,09h mov dx, offset mk1 mov cx,7 cikl1: mov bx,cx sub bx,1 mov dl,offset GrFLD1[bx] mov ah,02 int 21h loop cikl1 mov ah, 0; ожидание символа int 16h ret mes1 db 'Vvedite slovo iz 6 bukv: ','$' mk1 db '******','$' F LABEL BYTE ;Список параметров: MAXLEN1 DB 10 ; Максимальная длина ACTLEN1 DB ? ; Реальная длина GrFLD1 DB 20 DUP ('$') ; a db 0 b db 0 a1 db 0 b1 db 0 end start Результаты работы программы: Vvedite slovo iz 6 bukv: primer remirp 5 Листинг программы: masm .model small .model tiny .code org 100h .286 start: mov ah,9 lea dx,mes1 int 21h mov ah,0 int 16h push ax mov ah,00h mov al,12h int 10h pop ax mov dx,50 mov cx,50 sub al,30 cicl1: mov ah, 0ch int 10h add cx,2 add dx,1 cmp cx,200 jnz cicl1 cicl2: mov ah, 0ch int 10h sub cx,2 add dx,1 cmp cx,50 jnz cicl2 cicl3: mov ah, 0ch int 10h ;sub cx,2 dec dx cmp dx,50 jnz cicl3 ;задержка mov cx,0f000h q1: push cx MOV CX, 0f000h HERE: LOOP HERE pop cx loop q1 mov ax,0003h int 10h ret mes1 db 'Vvedite cvet ','$' end start |