| imho.ws |
![]() |
|
|
|
# 1 |
|
Guest
Сообщения: n/a
|
помогите с assembler
Помогите пожалуйста переделать немного следующую програмку:
LOCAL .286c code segment word Start: begin proc far assume cs:code,ds:data,es:data mov ax,1130h mov bh,03h int 10h push es pop ds mov si,bp mov ax,data mov es,ax lea di,outfont mov cx,128*8 rep movsb push es push di mov ax,1130h mov bh,03h int 10h push es pop ds mov si,bp pop di pop es mov cx,128*8 rep movsb mov ax,0013h int 10h mov ax,data mov ds,ax lea si,outtext next: lodsb cmp al,0 je bex call putchar inc word ptr px jmp next bex: xor ax,ax int 16h cmp al,1bh jz @@Exit mov ah,4ch int 21h begin endp @@Exit: mov ax,03h int 10h mov ax,04c00h int 021h putchar proc pusha mov cl,byte ptr gy mul cl lea si,outfont add si,ax mov ax,0a000h mov es,ax mov ax,word ptr py mul byte ptr gy mul word ptr lx mov di,ax mov ax,word ptr px mul byte ptr gx add di,ax mov cl,byte ptr gy xor ch,ch bl1: push cx mov ah,80h mov cl,byte ptr gx xor ch,ch bl2: test byte ptr [si],ah jz zero mov al,byte ptr color mov byte ptr es:[di],al zero: shr ah,1 inc di loop bl2 inc si mov bl,byte ptr gx xor bh,bh sub di,bx add di,word ptr lx pop cx loop bl1 popa ret putchar endp code ends data segment word outtext db 'HeLlO UsEr', 0 outfont db 256*8 dup (0) px dw 2 py dw 10 gx db 8 gy db 8 lx dw 320 ly dw 200 color db 0fh data ends segment_stack segment stack db 4096*4 dup (0) segment_stack ends end start end Это программа выводит на экран символы 8х8, а мне нужно 16х16. Где подправить? Помогите плз. |
|
|
# 2 |
|
::VIP::
Звезда первого сезона Молчун-2004 Регистрация: 24.08.2002
Сообщения: 1 575
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
ELFonok
Скорее всего нужно поменять константы 8 на 16, т.е. "gx db 8" и "gy db 8" на "gx db 16" и "gy db 16". Хотя, сорри. Это создает совсем другой эффект. Я так понял, 8х8 - размер шрифта в пикселях? Сейчас запустил у себя эту прогу - шриф не то что 8х8, а раза в 4 больше... ![]() Гыхм... Насколько я понял тип шрифта задается в строках Код:
mov ax,1130h mov bh,03h int 10h Код:
ftCgaGr8x8 = 0; // 8x8, графические режимы CGA (вектор int 1Fh) ftCurGr = 1; // шрифт текущего графического режима (вектор int 43h) ftBios8x14 = 2; // 8x14, шрифт BIOS ftBios8x8 = 3; // 8x8, шрифт BIOS ftBios8x8Ext = 4; // 8x8, шрифт BIOS, вторая половина таблицы (#128-#255) ftBios9x14 = 5; // 9x14, шрифт BIOS ftBios8x16 = 6; // 8x16, шрифт BIOS ftBios9x16 = 7; // 9x16, шрифт BIOS
__________________
Действовать надо тупо и это лучшее доказательство нашей чистоты и силы! Последний раз редактировалось Ghost; 28.05.2005 в 06:55. Причина: чертов Сайгон... |
|
|
|
|
# 3 |
|
Guest
Сообщения: n/a
|
В общем спасибо огромное, оно подошло! =)
Если кому нужно будет вот правлиьный вариант изменений (правда кроме шрифта и размера я еще поменял стартовую позицию, а то строка пооявлялась внизу) LOCAL .286c code segment word Start: begin proc far assume cs:code,ds:data,es:data mov ax,1130h mov bh,2 int 10h ; получение масок символов push es pop ds ; ds=es mov si,bp mov ax,data ; es=data mov es,ax lea di,outfont mov cx,128*16 ;перенос 128*8 байт из ds:d в es:s rep movsb push es ; сохранение шрифта push di mov ax,1130h mov bh,03h int 10h push es ; ds=es pop ds mov si,bp pop di pop es mov cx,128*16 rep movsb mov ax,0013h ; установка режима 320*200 int 10h mov ax,data ;ds=data mov ds,ax lea si,outtext ;загрузка адреса строки next: lodsb cmp al,0 je bex call putchar ;вывод символа inc word ptr px jmp next bex: xor ax,ax ; ожидание нажатия клавиши int 16h cmp al,1bh jz @@Exit mov ah,4ch int 21h begin endp @@Exit: mov ax,03h int 10h mov ax,04c00h int 021h putchar proc pusha mov cl,byte ptr gy ;вычисление смещения в массиве outfont mul cl lea si,outfont add si,ax mov ax,0a000h ; es=0a000h mov es,ax mov ax,word ptr py ;вычисление позиции символа в видеопамяти mul byte ptr gy mul word ptr lx mov di,ax mov ax,word ptr px mul byte ptr gx add di,ax mov cl,byte ptr gy xor ch,ch bl1: push cx mov ah,80h mov cl,byte ptr gx xor ch,ch bl2: test byte ptr [si],ah jz zero mov al,byte ptr color mov byte ptr es:[di],al ; вывод символа в память zero: shr ah,1 ; следующий бит inc di loop bl2 inc si mov bl,byte ptr gx xor bh,bh ;переход на следующую строку sub di,bx add di,word ptr lx pop cx loop bl1 popa ret putchar endp code ends data segment word outtext db 'HeLlO UsEr', 0 outfont db 256*16 dup (0) ;буфер под маски символов px dw 1 ;позиция символа на экране py dw 1 gx db 16 ;ширина символа gy db 16 ;высота символа lx dw 320 ly dw 200 color db 0fh data ends segment_stack segment stack db 4096*4 dup (0) segment_stack ends end start end |