Программирование на ассемблере: вариант №4

Печать E-mail
(3 голосов)
Автор 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


 
Контрольная работа по основам программирования на ассемблере вариант1 »