Помощь - Поиск - Пользователи - Календарь
Полная версия: вывод рамки
Форум «Всё о Паскале» > Delphi, Assembler и другие языки. > Assembler
amega
Добрый день! делаю лабу и в ней нужно вывести рамку с надписями, я написал часть (2 часть анолагичная первой ток с другим названием и распаложена ниже). Дак вот посмотрел предидущий топик , там рамка попроще написана. Хотелось бы узнать как уменьшить мой код.
ЗЫ лекций небыло пока, делаю с методой и учебником(но без результата)
ЗЫ2 програма ждет нажатия символа и завершается ее работа.


.MODEL SMALL
.STACK 100h
.DATA
mes db 'laba 2 SP','$'
.CODE
metka:
mov ax,@data
mov ds,ax
;очистка екрана
mov AH,0
mov AL,1
int 10H
;прорисовка уголка рамки
mov ah,09
mov al,201
mov bh,0
mov bl,00011111b
mov cx,1
int 10h
;передвижение курсора на 1 позицию вперед
mov ah, 2
mov bh,0
mov dh,0
mov dl,1
int 10h
;прорисовка линии
mov ah,09
mov al,205
mov bh,0
mov bl,00011111b
mov cx,30
int 10h
;передвижение курсора на конец линии
mov ah, 2
mov bh,0
mov dh,0
mov dl,31
int 10h
;прорисовка уголка рамки
mov ah,09
mov al,187
mov bh,0
mov bl,00011111b
mov cx,1
int 10h
;передвижение курсора на новуюю линию
mov ah,2
mov bh,0
mov dh,1
mov dl,0
int 10h
;прорисовка колонки
mov ah,09
mov al,186
mov bh,0
mov bl,00011111b
mov cx,1
int 10h
;передвижение курсора на начало надписи
mov ah,2
mov bh,0
mov dh,1
mov dl,10
int 10h
;прорисовка надписи
mov ah,09
mov dx,offset mes
int 21h
;передвижение курсора на конец линии
mov ah, 2
mov bh,0
mov dh,1
mov dl,31
int 10h
;прорисовка колонки
mov ah,09
mov al,186
mov bh,0
mov bl,00011111b
mov cx,1
int 10h
;передвижение курсора на новуюю линию
mov ah,2
mov bh,0
mov dh,2
mov dl,0
int 10h
;прорисовка колонки
mov ah,09
mov al,204
mov bh,0
mov bl,00011000b
mov cx,1
int 10h
;передвижение курсора на 1 позицию вперед
mov ah,2
mov bh,0
mov dh,2
mov dl,1
int 10h
;прорисовка линии
mov ah,09
mov al,205
mov bh,0
mov bl,00011000b
mov cx,30
int 10h
;передвижение курсора на коннец строки
mov ah,2
mov bh,0
mov dh,2
mov dl,31
int 10h
;прорисовка колонки
mov ah,09
mov al,185
mov bh,0
mov bl,00011000b
mov cx,1
int 10h

mov ah,10h
int 16h

mov ah,4ch
int 21h
END metka;

Client
сделай вывод параллельных сторон в цикле, т.е. верх и низ в одном цикле, левую и правую в другом.
volvo
Цитата
Хотелось бы узнать как уменьшить мой код.
Пишешь макрос (или процедуру, тут зависит от уровня владения ассемблером), выводящий символ, и 2 макроса, выводящих последовательность символов (вертикальную и горизонтальную линии). Тогда отрисовать рамку можно в 8 строк.
amega
Цитата
или процедуру, тут зависит от уровня владения ассемблером

увы, они пока маленькие. с макросами еще не работал
amega
Цитата
Тогда отрисовать рамку можно в 8 строк.

можеш показать как, а то невиходит ни как
volvo
Наконец-то добрался до своего компьютера, где установлен ASM... Вот это я имел в виду под использованием макросов:
.MODEL SMALL
.STACK 100h
.DATA
mes db 'laba 2 SP','$'

out_ch macro X
push cx
mov ah, 09h
mov al, X
mov bh, 0
mov bl, 00011111b
mov cx, 1
int 10h
pop cx
endm
vert_line macro X, sX, sY, L
local loop_1
mov cx, L
mov dh, sY
loop_1:
mov ah, 02h
mov bh, 0
mov dl, sX
int 10h
out_ch X
inc dh
loop loop_1
endm
horz_line macro X, sX, sY, L
local loop_2
mov cx, L
mov dl, sX
loop_2:
mov ah, 02h
mov bh, 0
mov dh, sY
int 10h
out_ch X
inc dl
loop loop_2
endm

.CODE
metka:
mov ax, @data
mov ds, ax

; очистка экрана
mov ah, 0
mov al, 1
int 10h


; прорисовка уголка рамки (левый верхний)
horz_line 201, 0, 0, 1 ;
; прорисовка верхней границы рамки
horz_line 205, 1, 0, 30 ;
; прорисовка уголка рамки (правый верхний)
horz_line 187, 31, 0, 1 ;
; прорисовка левой границы рамки
vert_line 186, 0, 1, 1
; прорисовка правой границы рамки
vert_line 186, 31, 1, 1 ;
; прорисовка угла (левый нижний)
horz_line 204, 0, 2, 1 ;
; прорисовка нижней границы рамки
horz_line 205, 1, 2, 30
; прорисовка угла (правый нижний)
horz_line 185, 31, 2, 1

; передвижение курсора на начало надписи
mov ah, 2
mov bh, 0
mov dh, 1
mov dl, 10
int 10h
; прорисовка надписи
mov ah, 09h
mov dx, offset mes
int 21h
mov ah, 10h
int 16h

mov ah, 4ch
int 21h
END metka
Что удобнее, каждый раз делать все вручную или пользоваться подобными средствами - решать тебе...
amega
огромное спасибо
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.