• XSS.stack #1 – первый литературный журнал от юзеров форума

Ассемблер Для Начинающих

BUG(O)R мене твой хелп нужен!Поможешь мне разобраться с одним исходником?Ты вообще с досом дружишь?:)
 
Ладосы!!!Прога должна выводить точку на экран в режиме 1024*768 64K цвета.У меня он не работает, даже разрешение нужное не устанавливается.Не знаю, наверное из-за того, что у меня AMD.

.model tiny
.code
.386
org 100h
start:
mov ax,4F01h
mov cx,116h
mov di,offset buffer
int 10h
mov ax,4F02h
mov bx,116h
int 10h

push word ptr [buffer+8]
pop es

cld
mov dx,100
mov bx,100
mov cx,1
call pset
mov ah,1
int 21h
ret
pset:
push dx
push di
xor di,di
shrd di,dx,6
shr dx,5
inc dx
cmp dx,current_bank
jne bank_switch
switched:
add di,bx
mov ax,cx
shl di,1
stosw
pop di
pop dx
ret
bank_switch:
push bx
xor bx,bx
mov current_bank,dx
call dword ptr [buffer+0Ch]
pop bx
jmp short switched
mov ax,0003h
int 10h
ret
current_bank dw 0
buffer:
end start

Вот такая лажа!Есть идеи?
 
mov ax,4F01h
mov cx,116h
mov di,offset buffer

Зачем ты получаешь информацию о видеорежиме если дальше ты всё равно не делаешь проверку?

mov ax,4F02h
mov bx,116h
int 10h

Может он не устанавливается потому что уже установлен?

У меня например вроде установил... Потом правда произошла ошибка на этапе вывода на экран точки.
 
Не может быть, чтобы режим был установлен!В досе по умолчанию стоит текстовый режим 0003h.
Информация о режиме нужна для того, чтобы переключать банк видео памяти:

mov current_bank,dx
call dword ptr [buffer+0Ch]

Конечно это можно сделать используя стандартную функцию биос, но так говорят, что быстрее!
А ты не мог бы помочь с выводом на экран точек при высоких разрешениях?Может у тебя есть стандартный алгоритм или что-нибудь в этом роде?
 
Эх, неблагодарное это дело, кодить под дос :)

Вообщем сам в этом не рублю, но уж коли взялся, будем вместе идти :)

Вообщем в справочнике по прерываниям нашёл я следующую функцию, почему бы нам не заюзать её:

INT 10h
AH = 0Ch ; Write dot on screen
AL = color of dot(0/1 in mode 6, 0-3 in mode 4 and 5)
if bit 7 set, new color will be XORed current pixel
BH = display page(0 - based)
CX = column
DX = row

Т.е. насколько я понимаб надо сначала установить режим, а потом вызвать эту функцию? Зачем тебе досовский int 21h с ah=1?

На каком этапе мы сейчас? У тебя устанавливается видеорежим?
 
Эх, неблагодарное это дело, кодить под дос :)

Вообщем сам в этом не рублю, но уж коли взялся, будем вместе идти :)

Вообщем в справочнике по прерываниям нашёл я следующую функцию, почему бы нам не заюзать её:

INT 10h
AH = 0Ch ; Write dot on screen
AL = color of dot(0/1 in mode 6, 0-3 in mode 4 and 5)
if bit 7 set, new color will be XORed current pixel
BH = display page(0 - based)
CX = column
DX = row

Т.е. насколько я понимаб надо сначала установить режим, а потом вызвать эту функцию? Зачем тебе досовский int 21h с ah=1?

На каком этапе мы сейчас? У тебя устанавливается видеорежим?
судя по всему, он юзает не обычный функции прерывания 10, а функции SVGA. Поэтому 0ch не покатит вроде
 
Ah=1 и int 21h нужен для ожидания нажатия клавиши.
Great прав!Эта функция тут не катит!Она работает максим с 256 цветами не более того. Ещё один глюк обнаружился устанавливаются все разрешения с 16, 256 цветами и 24-32 бита цвета, а остальные не работают!Глюки в компилятарах исключены, работал в чистом дос.
 
Ah=1 и int 21h нужен для ожидания нажатия клавиши.

Тогда ОЙ, не удосужился в справочнике посмотреть, прошу прощенья :)

Давай пойдём методом от противного, какая разница в какой режиме рисовать ТОЧКУ? :)
 
Существует 2 типа вывода графики вообще:
1)Через переключение банков видео памяти
2)Через LFB(тобишь линейный кадровый буфер)
Нас интересует первое.Т.к. в дос по адресу 0A000h можно заполнить 64000 байт или 320*200 байт при 256 цветах, то для того чтобы заполнить экран с большим разрешением или количеством цветов, нам надо переключать банки.Естественно чем больше разрешение тем больше кол-во переключаемых банков.
Разница в том, что нам приходится с увеличением разрешения и кол-ва цветов переключать банки всё чаще, т.к. естесвенно 64000 байта very low!:)
 
http://www.kalashnikoff.ru/

сайт не работает! :(
Добавлено в [time]1135947209[/time]
а вообще! чтобы программировать под Windows надо изучучать наверное сначала под ДоС и процессоры 8086?
или же мона сразу начать учиться под Windows! :punk: (сомневаюсь!(
 
Чтобы набить руку и более или менее изучить все команды надо бы сначала в дос посидеть.А после в винде будет легче.
 
Вообще ДОС ассемблер стоит на уровень ниже WIN, не в смысле возможностей, а в смысле реализации, т.к. в win всю работу по сути делают за нас API, а вот ДОС там конечно с этим сложнее, поэтому я бы советовал сначала ДОС.
 
Ребяты у меня ещё вопрос!Как я понимаю все числа в регистрах хранятся в двоичном формате, как бы мне из него получать сразу ASCII формат?
Например если в AX находится число 122(mov ax,122), то как мне из него получить это же число только в формате ASCII?
 
Например если в AX находится число 122(mov ax,122), то как мне из него получить это же число только в формате ASCII?

писал на masm32:
Код:
xor ebx,ebx

.while byte ptr[arr+ebx]!=0
mov al,byte ptr[arr+ebx]      	
.if(al<=9)      
add al,30h      	
.else
add al,37h
.endif
mov byte ptr[string+ecx],al
inc ebx
.endw

arr db 1,2,2,0Ah,0Bh,0Ch
string db 255 dup(?)
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх