Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Assembler

Автор: akaGM
Дата сообщения: 23.10.2011 14:03
A1exSun

b800:0000 1-ый символ
b800:0001 его атрибут цвет/фон (тетрадный типа 70h)
b800:0002 2-ой символ
b800:0003 его атрибут цвет/фон

и так далее...
Автор: MERCURY127
Дата сообщения: 23.10.2011 14:03
не просто еще чередовать байты текста надо, с байтами атрибутов...
Автор: bomzzz
Дата сообщения: 23.10.2011 14:04
B800:0000 вот начальный адрес щас покажу на эммуляторе
Автор: akaGM
Дата сообщения: 23.10.2011 14:04
[cencored]
Автор: bomzzz
Дата сообщения: 23.10.2011 14:10
вот запись байта с асци кодом буквы а привел к выводу ее на экран, второй байт это цвет.


Добавлено:
так быстрее всего, по крайней мере когда на бейсике программы писал такой вывод НУ ОЧЕНЬ быстродействие ускорял

Добавлено:
игрушку на бейсике по другому не напишешь

Добавлено:
я какда это узнал - это был первый шаг от бейсика к ассемблеру

Добавлено:
насчет stosb я погорячился, дата сегмент будет указывать у тебя на сегмент где твоя переменная с временем, а записывать надо относительно es. сходу не вспомню какие команды надо использовать

Добавлено:
mov ax, 0B800h
mov es, ax
mov es:0000h, 61h

вот так. но это тасм, не знаю как для вставки на Си будет

Добавлено:
lodsb ds si
stosb es di

вот эта связка
Автор: A1exSun
Дата сообщения: 23.10.2011 14:43

Цитата:
mov es:0000h, 61h

invalid combination of opcode and operands

чем такие анимации записывать?
Автор: bomzzz
Дата сообщения: 23.10.2011 14:48
нет ни фига MOVSB

Добавлено:

Цитата:
чем такие анимации записывать?

http://forum.ru-board.com/topic.cgi?forum=62&bm=1&topic=21681#1

Добавлено:
http://256bit.ru/Assembler/Pr/Index19.htm
Команды предназначены для операций над строками (строкой называется последовательность байтов или слов памяти с любым содержимым). Они пересылают по одному элементу строки, который может быть байтом или словом. Первый операнд (приемник) адресуется через ES:DI, второй (источник) - через DS:SI. Операцию пересылки можно условно изобразить следующим образом:

(DS:SI) -> (ES:DI)


только что не получится в одну строку. di надо будет на 1 увеличивать чтоб атрибут цвета пропустить

Добавлено:

Цитата:
invalid combination of opcode and operands

синтаксис у тебя другой у тебя асм для Си, а эммулятор это фасм тасм совместимый

Добавлено:
или все таки в ah записать 07 и использовать lodsb stosw тут уже надо такты считать. причем на разных процах разные результаты будут
Автор: A1exSun
Дата сообщения: 23.10.2011 15:09
Не понимаю нифига

Добавлено:
Нашел в emu8086 пример:

Код: mov ax, 0b800h
mov ds, ax
; print "hello world"
; first byte is ascii code, second byte is color code.
mov [02h], 'H'
mov [04h], 'e'
mov [06h], 'l'
mov [08h], 'l'
mov [0ah], 'o'
mov [0ch], ','
mov [0eh], 'W'
mov [10h], 'o'
mov [12h], 'r'
mov [14h], 'l'
mov [16h], 'd'
mov [18h], '!'
Автор: bomzzz
Дата сообщения: 23.10.2011 15:16
ну тебе надо просто перекопировать байты из твоей перменной смещение p, а DS указывает на сегмент памяти, в области видео памяти - речб уже чисто идет как оптимизировать код.
переменная у тебя вида 10:15,0 а в видео памяти запись будет вида 41,07,40,07.....

можно сделать это командой lodsb например она копирует в регистр al содержимое ячейки памяти DS:SI и увеличивает SI на 1 - переводит на следующий байт, а загрузить в видео память командой STOSB которая загружает содержимое al в память по адресу ES:DI и увеличивает DI на единицу. но тебе надо еще пропускать байт цвета то есть после этой команды перевести указатель еще на один байт.
или можно использовать команду MOVSB которая копирует байт из DS:SI в ES:SI и сразу увеличивает и DI и SI. но тоже надо придумать как байт цвета пропускать

Добавлено:

Цитата:
Но в BC 3.1 он не работает.

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

Добавлено:

Цитата:
Нашел в emu8086 пример:

ключик нашел?
Автор: A1exSun
Дата сообщения: 23.10.2011 15:23
Хорошо, подождем.
В принципе, у меня строка всего 5 символов, думаю скорость здесь играет малую роль...
А как курсор переместить на 75 колонку?


Цитата:
ключик нашел?

keygen нашел

Добавлено:
bomzzz
у тебя есть ICQ либо Jabber?
Автор: bomzzz
Дата сообщения: 23.10.2011 15:28
управление курсором надо смотреть. если быстродействие роли не играет то зачем ассемблерную вставку делать. ты один раз разбрешеься потом все время будет этот кусок кода использовать. к тому же тут еще речь идет о крайне полесных командах работы со строками

Добавлено:

Цитата:
у тебя есть ICQ либо Jabber?

нету. личка етсь на форуме. да я не особо рублю. лучше у ВСЕХ спросить тута
Автор: A1exSun
Дата сообщения: 23.10.2011 15:31
bomzzz

Цитата:
если быстродействие роли не играет то зачем ассемблерную вставку делать

затем, что функциями Си в обработчике прерывания текст не вывести
Автор: bomzzz
Дата сообщения: 23.10.2011 21:51

Цитата:

org 100h

mov ax, 0B800h
mov es, ax

lea si, msg у тебя тут будет mov si, p
mov di, 150

;mov cx, 5
;rep movsb

next:
lodsb
cmp al, 0
je finish
stosb
inc di
jmp short next
finish:
ret
msg db '10:10',0

надо подумать как оптимальнее сделать
понятно почему так сделали - для цвета

Цитата:

org 100h

mov ax, 0B800h
mov es, ax
lea si, msg
mov di, 150
mov ah, 10
next:
lodsb
cmp al, 0
je finish
stosw
jmp short next
finish:
ret
msg db '10:10',0



Цитата:

org 100h

mov ax, 0B800h
mov es, ax
lea si, msg
mov di, 150
mov ah, 10
mov cx, 5
next:
lodsb
stosw
loop next
ret
msg db '10:10',0



Цитата:

org 100h

mov ax, 0B800h
mov es, ax
lea si, msg
mov di, 150
mov ah, 10
mov cx, 5
rep movsw
ret
msg db 31h,0Ah,30h,0Ah,3Ah,0Ah,31h,0Ah,30h,0Ah


у мине проц древний, средней древности команда lods stos movs и тд выполняются медленне чем mov+inc (а изменение флага направления вообще долго), на более модных процах эти команды оптимизированы и уже быстрее выполняются.
но в любом случае будет быстрее чем прерывания биоса вызывать - тут надо регистры в стек засунуть, адрес возврата, вызвать код который сидит в другом месте и может не быть в кеше, потом вернуться....

и тута еще можно схитрить использовать для пересылки данных 32 битные регистры, все равно 8088 процов уже мало и врядли кто на них твою сишную прогу будет запускать, на них винду то не поставить, это в два раза может ускорить выведение изображения - если бмп картинку надо вывести например
Автор: kentuki13
Дата сообщения: 24.10.2011 03:57
Здраствуйте, уважаемые! Поясните, пожалуйста, как мне нарисовать разноцветный текст? То есть нужно нарисовать несколько строк и каждое слово другим цветом. В голову приходит только выводить каждое слово отдельным TextOut и перед каждым текстоутом устанавлить SetTextColor, но мне почему то кажется ето глупой затеей...
Автор: bomzzz
Дата сообщения: 24.10.2011 04:11
kentuki13

Цитата:

org 100h
mov ax, 0B800h
mov es, ax
mov di, 0
mov ax, 130h
mov cx, 80
next:
stosw
loop next
inc al
inc ah
mov cx, 80
cmp ah, 26
jne next
ret




Цитата:

org 100h
mov ax, 0B800h
mov es, ax
mov di, 0
mov ah, 1
lea si, msg

next:
lodsb
cmp al, 0
jz finish
cmp al, ' '
jne color
inc ah
and ah, 00001111b
color:
stosw
jmp short next
finish:
ret
msg db '111 222 333 444 555 666 777 888 999 000 AAA BBB CCC DDD EEE FFF GGG HHH JJJ III KKK LLL',0


каждое следующее слово печатается другим цветом. не маху только сообразить как дешево от черного цевта избавится - его не видно на черном фоне
Автор: akaGM
Дата сообщения: 24.10.2011 09:32
kentuki13
а ты топик/язык программирования не попутал?
на турбо паскале не здесь пишут...
Автор: bomzzz
Дата сообщения: 24.10.2011 13:23

Цитата:
REBOOT очищает буферы диска, перезадает диски и организует 1-секундное ожидание перед осуществлением перезагрузки, чтобы дать возможность программам кэширования диска закончить запись любых кэшевых данных.


я вот всё понять не могу, какой смысл в паузе? кроме того что без паузы кеш нтфс драйвера и так сбрасывается, смартдрв не могу придумать как проверить. любой кеширующий драйвер должен перехватить это прерывание и когда она вызывается сбросить кеш, и пока кеш не сбросится из вызова возврата не будет.
4DOS не дураки писали зачем то они это сделали, как и переинициализацию дисков.
Автор: A1exSun
Дата сообщения: 24.10.2011 13:49
bomzzz
Видеопамять это массив 160х50 или? Первый байт символ, второй его атрибут?
Автор: bomzzz
Дата сообщения: 24.10.2011 13:51
в зависимости от видео режима. на каждый элемент экрана два байта символ - цвет символа + цвет фона. так как этот видео режим 80 на 24 - вот и считай, в строку 160 байт в высоту 48

Добавлено:
по видео режимам полно статей в инете. и кстати для корректности тут надо добавить принудительное переключение в 3-ий (кажется) видео режим

Добавлено:
с 12 видео режима кажется уже не влазит в один сегмент 64 кбайта и там экран на два банка разбивается по 64 кбайта. и начальный адрес кажется другой. в гугле набери видео режимы

Добавлено:
http://bomz-co.narod.ru/LOGO.zip
вот я делал себе как то для вывода бмп картинки на экран. но и в инете примеров полно рабочих. это надо писать постоянно, я пишу эпизодически потому ниче в упор не помню надо разбираться по нвоой.


Цитата:

; ===============================================================
; ===============================================================
.186
name LOGO
; ===============================================================
; === Начало программы: ===
CSEG segment use16
assume cs:cseg, ds:cseg, ss:cseg, es:cseg
org 100h            ; COM файл
; ===============================================================
Start:

    mov    ax, 3D00h    ; открываем файл только для чтения
    lea    dx, file    ; указатель на строку с именем файла
    int    21h
    jnc    File_Exist

    lea dx, No_File    ; Ошибка открытия файла
mov ah, 09h        ;
int 21h        ;

    int    20h        ; выходим из программы

File_Exist:

    mov    handle, ax

; === Готовим основную память ===

    lea bx, Finish
    shr bx,4
    inc bx
    mov ah,4Ah
    int 21h        ; Ужимаем размер отведенной памяти до метки Finish

    mov ah, 48h        ; выделим блок памяти под буфер
    mov bx, 4096    ; 4096 * 16 = 65536 байт = 1 сегмент
    int 21h
    jnc Memory_OK
; ---
    mov    ah, 3eh        ; закрываем файл
    mov    bx, handle
    int    21h

    lea dx, Memory_Error
mov ah, 09h        ; выводим сообщение об ошибке
int 21h        ;

    int    20h        ; выходим из программы

Memory_OK:

    mov    Buffer,ax    ; сегмент в основной памяти выделенного блока

; === Установка цветовой палитры ===

    mov    ax,4F02h    ; переключаем видео режим
    mov    bx,101h
    int    10h
; ---
    mov    ax, 4200h    ; сместить указатель файла от начала
    mov    bx, handle
    xor    cx, cx
    mov    dx, 54        ; на 54 байта - заголовок файла
    int    21h

    push    Buffer        ; переведем регистр сегмента даты на выделенный блок памяти
    pop    ds

    mov     ah, 3fh        ; чтение из файла
;    mov     bx, handle    ;
    mov     cx, 1024    ; читаем 1024 байт
    xor    dx, dx        ; в начало буфера
    int     21h        ;
    jnc     Pallete_OK    ; ошибка чтения файла
; ---
    push    cs        ; перведем регистр сегмента даты на сегмент программы
    pop    ds

    mov    es,Buffer    ; освободим блок выделенной памяти под буфер
    mov ah, 49h        ; в es параграф блока
    int 21h

    mov    ah, 3eh        ; закрываем файл
;    mov    bx, handle
    int    21h

    mov    ax,3h        ; возвращаемся в текстовый видео режим
    int    10h

    lea dx, Read_Error
mov ah, 09h        ; выводим сообщение об ошибке
int 21h        ;

    int    20h        ; выходим из программы

Pallete_OK:

    xor    ax, ax
    mov    si, 1024
    mov    cx, 100h

Next_Color:

    mov    dx,3c8h
    mov    al, cl        ; прим. когда cx равно 100h в al помещается 0
    dec    ax        ; но при отнимании 1 в al все равно получается FF
    out    dx,al

    mov    dx,3c9h

    dec    si        ; пропускаем зарезирвированный байт в палитре BMP
    dec    si        ; RED
    mov    al, byte ptr[si]    ; в BMP палитре цвета расположены наоборот
    shr    ax, 2
    out    dx,al

    dec    si        ; GREEN
    mov    al, byte ptr[si]
    shr    ax, 2
    out    dx,al

    dec    si        ; BLUE
    mov    al, byte ptr[si]
    shr    ax, 2
    out    dx,al

    loop    Next_Color

    push    0A000h        ; в es сегмент даты видео буфера
    pop    es
    mov    word ptr ds:[8002h], 0    ; счетчик видео страниц

; === Вывод изображения ===
Next_Page:

    push    bx        ; bx всю дорогу будет содержать хендл файла
    mov    ax, 4F05h
    xor    bx, bx
    mov    dx, word ptr ds:[8002h]
    int    10h
    pop    bx

    mov     ah, 3fh        ; чтение из файла
;    mov     bx, handle    ;
    mov     cx, 8000h    ; читаем 32768 байт
    xor    dx, dx        ; в начало буфера
    int     21h        ;

    xor    si, si
    xor    di, di
    mov    cx, 8000h
    Rep    movsb        ; DS:SI и ES:DI

    mov     ah, 3fh        ; чтение из файла
;    mov     bx, handle    ;
    mov     cx, 8000h    ; читаем 32768 байт
    xor    dx, dx        ; в начало буфера
    int     21h        ;

    xor    si, si
    mov    di, 8000h
    mov    cx, ax
    Rep    movsb        ; DS:SI и ES:DI

    inc    word ptr ds:[8002h]
    cmp    word ptr ds:[8002h], 5
    jb    Next_Page

; === Завершаем программу ===

    push    ds
    pop    es

    push    cs
    pop    ds

;    mov    es,Buffer    ;освободим блок выделенной памяти под буфер
    mov ah, 49h        ;в es параграф блока
    int 21h

    mov    ah, 3eh        ; закрываем файл
;    mov    bx, handle
    int    21h

mov ah, 0
int 16h        ; ожидаем нажатия любой клавиши

    mov    ax,3h        ; возвращаемся в текстовый видео режим
    int    10h

    int    20h        ; выходим из программы

; === Блок данных ===
Buffer        dw    ?        ; сегмент выделенной памяти
handle        dw    ?        ; хендл файла
file        db    'LOGO.BMP',0    ; имя файла
No_File        db    'ЋиЁЎЄ  ®вЄалвЁп д ©« ', 0Dh,0Ah, 24h    ; Ошибка открытия файла
Read_Error    db 'ЋиЁЎЄ  звҐ-Ёп д ©« ', 0Dh,0Ah, 24h    ; Ошибка чтения файла
Memory_Error    db 'ЋиЁЎЄ  Ї ¬пвЁ', 0Dh, 0Ah, 24h        ; Ошибка выделения памяти для буфера
; ---
Finish:        ;метка усечения памяти программы
CSEG ends
end Start
Автор: akaGM
Дата сообщения: 24.10.2011 14:32
[cencored]
Автор: bomzzz
Дата сообщения: 24.10.2011 15:07

Цитата:
Видеопамять это массив 160х50 или?

видео память это скорее строка, то есть одномерный массив
Автор: A1exSun
Дата сообщения: 24.10.2011 17:23
akaGM
censored?
Автор: akaGM
Дата сообщения: 24.10.2011 17:41
yec
Автор: kentuki13
Дата сообщения: 24.10.2011 19:54
akaGM, лол, турбо паскаль. Нет не попутал, нужно то что я описал на масме через вин 32 апи функции. Или пошлешь меня теперь в раздел С/C++ ?

Добавлено:
bomzzz, спасибо конечно, но не то, сори затупил что не обьяснил сразу что у меня оконное приложение.
Автор: bomzzz
Дата сообщения: 24.10.2011 20:23
ага я понил. ну можно сделать с ходу не помню как. ты бы подробнее написал или нарисовал что тебе надо
Автор: akaGM
Дата сообщения: 24.10.2011 21:09
kentuki13
не, не пошлю...
а вот по линку в шапке послал бы...
Автор: kentuki13
Дата сообщения: 24.10.2011 21:22
Есть допустим такая строка:
text \
db 'bla bla bla',0dh,0ah
db 'bla bla bla',0

Нужно нарисовать ее на моем окне, все слова разным цветом. Я так догадываюсь, что можна вывести строку через единый DrawText или TextOut или еще както, а уже потом изменить цвет определенной части отрисованой строки?

http://s2.ipicture.ru/uploads/20111024/WuKAK451.jpg
Автор: MERCURY127
Дата сообщения: 24.10.2011 21:32
Не потом ты его уже никак не изменишь... Рисуй каждое слово отдельным проходом, с выбором цвета и ручным позиционированием. Рисовал когда то я так для печати конвертов - маразм тот еще
Автор: kentuki13
Дата сообщения: 24.10.2011 22:31
MERCURY127, спасибо за ответ, жаль конечно, что нет способа логичней...
Автор: bomzzz
Дата сообщения: 27.10.2011 22:45
asm-16
а как отличить папку и файл? по атрибутам?
а как получить\задать длинные имена? должен быть какой то стандарт

Добавлено:
у калашникова есть про длинные имена. а отдельно описание прерываний не могу найти

Цитата:

Как получить и вывести длинное имя файла? Для этого следует воспользоваться НЕ функциями 4Eh и 4Fh, а 714Eh и 714Fh прерывания 21h. Вот так:

mov ax,714Eh ;Функция поиска первого файла
xor di,di ;DI должен указывать на буфер, куда будут записываться данные о найденном файле (типа DTA).
xor si,si ;SI пока остается тайной!
mov cx,0FFh ;Ищем все возможные файлы. Это что-то вроде атрибутов файла
mov dx,offset All_files ;Маска поиска (*.*)
int 21h ;Теперь в ES:DI находится информация о найденном файле!
mov Handle,ax ;Номер процесса поиска файлов
http://kalashnikoff.ru/Assembler/issues/025.htm#shell

Добавлено:
никто не знает в 16 ричном тасме можно структуру задать и если да то как?
разобрался - так же как в масме32

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384

Предыдущая тема: .NET GUI компоненты


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.