Помощь - Поиск - Пользователи - Календарь
Полная версия: Вывод символов Ascii
Форум «Всё о Паскале» > Delphi, Assembler и другие языки. > Assembler
Jaxx
Необходимо вывести все символы таблицы ASCII на экран, по 80 символов в каждой строке.
xds
.model tiny

.code
.startup
mov ax,3 ;не сработает на MDA (сэкономил на объёме кода) :/
int 10h
mov ax,0B800h
mov es,ax
mov ah,7
xor di,di
cld
put_char:
stosw
inc al
jnz put_char
mov ah,4Ch
int 21h

end

Jaxx
Програмулина работает, но с небольшим косяком. Косяк в следующем:
файл СОМ лежит на диске С, в корне. Запускаем DOS, переходим на диск С, появляется C:>\, и при запуске проги эта ерундовина остается, поэтому получается следующее:
Код

☺☻♥♦♣♠•◘○◙♂♀♪♫☼►◄↕‼¶§▬↨↑↓→←∟↔▲▼ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNO
C:\>TUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~⌂АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ
абвгдежзийклмноп░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀рстуфхцчшщъыьэюя
ЁёЄєЇїЎў°∙·√№¤■ 

То есть, C:>\ закрывает 4 символа. Можно ли сделать какую-нибудь очистку экрана перед выводом символов, или еще что-нибудь?
И кстати, что такое MDA?
FreeMan
тогда надо чтоб вывод был с третьей строчки.
вместо
xor di,di
написать
mov di,6*80

ну а объём сократить, поставив вместо

mov ah,4Ch
int 21h
просто
ret
Jaxx
Я мыслю, что будет лучше сделать в каждой строке по 64 символа, тогда получится красивый квадратик. Это все дело нужно выводить не на первой строке, а начиная со второй. А разве в Асме нет аналога паскалевского CLRSCR?
Dark
заполни экран пробелами. В цикле =)))
FreeMan
можно перейти на др. видеостраницу, там обычно пусто. или сделать прокрутку экрана... но лучше - пробелами
FreeMan
.model tiny

.code
.startup
mov ax,3;не сработает на MDA (сэкономил на объёме кода) :/
int 10h
mov ax,0B800h
mov es,ax
mov ah,' '
xor di,di
               mov cx,7d0h
cld
put_char:
stosw
               dec cx
               jnz put_char
;тут можно ещё поставить ожидание нажатия на кгопку, но я прерывание забыл
ret
end

чистит экран. заметь, что это просто нагло содрано у xds.
xds
При вызове int 10h/ah=0 экран всегда автоматически очищается (даже если устанавливаемый видеорежим совпадает с текущим).

Экран очищается, 64 символа в строке, перед завершением курсор перемещается в начало шестой строки экрана (для любителей нарушать рекомендации, выход осуществляется с помощью ret):

.model tiny

.code
.startup
mov ax,3
int 10h
mov ax,0B800h
mov es,ax
mov ah,70h
mov di,176
cld
mov dx,4
put_line:
mov cx,64
put_char:
stosw
inc al
loop put_char
add di,(80-64)*2
dec dx
jnz put_line
mov ah,2
xor bx,bx
mov dh,5
int 10h
ret

end



P.S. MDA - Monochrome Display Adaptor
Jaxx
XDS, твой последний вариант отлично справляется со своей задачей. Сенкс!
Только напоследок вопрос: при запуске вылазиет ошибка NTVDM, 16 -разрядная система MS-DOS и тд и тп...Окошко ошибки в прикрепленном файле. Как с этим бороться?Нажмите для просмотра прикрепленного файла
Jaxx
Есть такой вариант:
.model tiny
.code
org 100h
start:
 mov cx,256
 mov dl,0
 mov ah,2
cloop:
 int 21h
 inc dl
 test dl,0Fh
 jnz continue_loop
 push dx
 mov dl,0Dh
 int 21h
 mov dl,0Ah
 int 21h
 pop dx
continue_loop:
 loop cloop
 ret
end start

Проверьте. Тут вывод по 16 символов в строке, но суть не в этом. У меня почему-то программа идет по бесконечному циклу. И вдобавок с музыкой smile.gif после каждого цикла.
FreeMan
сделай в начале цикла
push cx
, а в конце
pop cx
Jaxx
Нашел полностью рабочий вариант. Даже с оформлением. Может, кому пригодится.
model tiny 	 
codeseg  
startupcode  
mov ax,3  
int 10h  
mov ax,0b800h  
mov es,ax
mov dl,16
mov ah,0bh
mov al,0
mov cx,255
mov bx,166

rus:
mov es:[bx],ax  
add al,1  
add bx,6
cmp dl,al  
jnz rrr  
add bx,64
add dl,16
rrr:
loop rus  
mov ah,14
mov al,'0'
mov cx,16
mov bx,6
mov dl,':'
mov di,160
stroka:
mov es:[bx],ax
mov es:[di],ax
add di,160
add al,1
add bx,6
cmp al,dl  
jnz ddd  
mov al,'A'
mov dl,'G'
ddd:
loop stroka  
       MOV AH,0
       INT 16h  
       INT 20h    
end
MixRin.RU$
насчет перевода курсора на третью строчку - функция 02h int 10h
ВХОД:
AH = 02h
BH = номер видеостраницы
DH = номер строки (00h - верх)
DL = колонка (00h - левая)
есть аналогичная функция для получения позиции курсора, если надо - приведу... smile.gif

Угу, особенно это становится нужным, если учесть что вопросу уже 7 месяцев...
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.