imho.ws
IMHO.WS  

Вернуться   IMHO.WS > Компьютеры > Программирование
Опции темы
Старый 28.05.2005, 00:27     # 1
ELFonok
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.
Где подправить?
Помогите плз.
 
Старый 28.05.2005, 06:26     # 2
Ghost
::VIP::
Звезда первого сезона
Молчун-2004
 
Аватар для Ghost
 
Регистрация: 24.08.2002
Сообщения: 1 575

Ghost Отец (мать) всех ГуруGhost Отец (мать) всех ГуруGhost Отец (мать) всех ГуруGhost Отец (мать) всех ГуруGhost Отец (мать) всех ГуруGhost Отец (мать) всех ГуруGhost Отец (мать) всех ГуруGhost Отец (мать) всех ГуруGhost Отец (мать) всех ГуруGhost Отец (мать) всех ГуруGhost Отец (мать) всех ГуруGhost Отец (мать) всех ГуруGhost Отец (мать) всех ГуруGhost Отец (мать) всех ГуруGhost Отец (мать) всех ГуруGhost Отец (мать) всех ГуруGhost Отец (мать) всех Гуру
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
Тебе нужно 03h заменить на одно из значений:
Код:
 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. Причина: чертов Сайгон...
Ghost вне форума  
Старый 28.05.2005, 08:47     # 3
ELFonok
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
 

Опции темы

Ваши права в разделе
Вы НЕ можете создавать новые темы
Вы не можете отвечать в темах.
Вы НЕ можете прикреплять вложения
Вы НЕ можете редактировать свои сообщения

BB код Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.

Быстрый переход


Часовой пояс GMT +4, время: 20:01.




Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.