Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по программированию на Assembler

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133

Открыть новую тему     Написать ответ в эту тему

ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Обсуждаются все вопросы, связанные с программированием на Ассемблере как общего так и конкретного характера.
 
важное примечание
для тех кто считает, что здесь место халявных исполнений курсовых и лабораторных работ.
тут обычно помогают тем, кто сам хоть что-то пытается понять и сделать, но что-то не понимает, что-то не получается...
ведь ассемблер изучают и задачки на нём дают обычно не менеджерам по продажам и даже не всем физ.-мат. специальностям
вы сами избрали этот путь? вот и идите по нему сами, ножками... с ручками и с головой...
 
короче, тут не сборище придурков-альтруистов, которым нечего делать и они ждут-не дождутся когда вы их попросите
что-то сделать _за_ вас
если позарез надо и вы даже готовы заплатить, тогда вам сюда
удачи
 
некоторые ресурсы
http://www.wasm.ru/ Самый популярный русскоязычный ресурс. https://wasm.in/
Ассемблер - книги (ASM, Assembler)
 
Просьба все большие листинги оформлять тегом more.
 
если вам вдруг не отвечают или ответ вас не устраивает
и вообще полезно прочитать всем спрашивающим

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 01:42 29-11-2006 | Исправлено: akaGM, 17:44 11-06-2020
A1exSun



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Не понимаю нифига
 
Добавлено:
Нашел в 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], '!'

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

Всего записей: 1871 | Зарегистр. 25-11-2009 | Отправлено: 16:09 23-10-2011
bomzzz



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ну тебе надо просто перекопировать байты из твоей перменной смещение 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 пример:  

ключик нашел?

Всего записей: 13343 | Зарегистр. 13-01-2008 | Отправлено: 16:16 23-10-2011 | Исправлено: bomzzz, 16:20 23-10-2011
A1exSun



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Хорошо, подождем.
В принципе, у меня строка всего 5 символов, думаю скорость здесь играет малую роль...
А как курсор переместить на 75 колонку?
 

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

keygen нашел
 
Добавлено:
bomzzz
у тебя есть ICQ либо Jabber?

Всего записей: 1871 | Зарегистр. 25-11-2009 | Отправлено: 16:23 23-10-2011
bomzzz



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
управление курсором надо смотреть. если быстродействие роли не играет то зачем ассемблерную вставку делать. ты один раз разбрешеься потом все время будет этот кусок кода использовать. к тому же тут еще речь идет о крайне полесных командах работы со строками
 
Добавлено:

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

нету. личка етсь на форуме. да я не особо рублю. лучше у ВСЕХ спросить тута

Всего записей: 13343 | Зарегистр. 13-01-2008 | Отправлено: 16:28 23-10-2011 | Исправлено: bomzzz, 16:30 23-10-2011
A1exSun



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
bomzzz

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

затем, что функциями Си в обработчике прерывания текст не вывести

Всего записей: 1871 | Зарегистр. 25-11-2009 | Отправлено: 16:31 23-10-2011
bomzzz



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
 
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 процов уже мало и врядли кто на них твою сишную прогу будет запускать, на них винду то не поставить, это в два раза может ускорить выведение изображения - если бмп картинку надо вывести например

Всего записей: 13343 | Зарегистр. 13-01-2008 | Отправлено: 22:51 23-10-2011 | Исправлено: bomzzz, 00:13 24-10-2011
kentuki13

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Здраствуйте, уважаемые! Поясните, пожалуйста, как мне нарисовать разноцветный текст? То есть нужно нарисовать несколько строк и каждое слово другим цветом. В голову приходит только выводить каждое слово отдельным TextOut и перед каждым текстоутом устанавлить SetTextColor, но мне почему то кажется ето глупой затеей...

Всего записей: 9 | Зарегистр. 23-10-2011 | Отправлено: 04:57 24-10-2011
bomzzz



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
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
 


каждое следующее слово печатается другим цветом. не маху только сообразить как дешево от черного цевта избавится - его не видно на черном фоне

Всего записей: 13343 | Зарегистр. 13-01-2008 | Отправлено: 05:11 24-10-2011 | Исправлено: bomzzz, 08:25 24-10-2011
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kentuki13
а ты топик/язык программирования не попутал?
на турбо паскале не здесь пишут...

Всего записей: 24106 | Зарегистр. 06-12-2002 | Отправлено: 10:32 24-10-2011
bomzzz



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

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

 
я вот всё понять не могу, какой смысл в паузе? кроме того что без паузы кеш нтфс драйвера и так сбрасывается, смартдрв не могу придумать как проверить. любой кеширующий драйвер должен перехватить это прерывание и когда она вызывается сбросить кеш, и пока кеш не сбросится из вызова возврата не будет.
4DOS не дураки писали зачем то они это сделали, как и переинициализацию дисков.

Всего записей: 13343 | Зарегистр. 13-01-2008 | Отправлено: 14:23 24-10-2011
A1exSun



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
bomzzz
Видеопамять это массив 160х50 или? Первый байт символ, второй его атрибут?

Всего записей: 1871 | Зарегистр. 25-11-2009 | Отправлено: 14:49 24-10-2011
bomzzz



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
в зависимости от видео режима. на каждый элемент экрана два байта символ - цвет символа + цвет фона. так как этот видео режим 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
 

Всего записей: 13343 | Зарегистр. 13-01-2008 | Отправлено: 14:51 24-10-2011 | Исправлено: bomzzz, 15:05 24-10-2011
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
[cencored]

Всего записей: 24106 | Зарегистр. 06-12-2002 | Отправлено: 15:32 24-10-2011 | Исправлено: akaGM, 15:40 24-10-2011
bomzzz



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

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

видео память это скорее строка, то есть одномерный массив

Всего записей: 13343 | Зарегистр. 13-01-2008 | Отправлено: 16:07 24-10-2011
A1exSun



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
akaGM
censored?

Всего записей: 1871 | Зарегистр. 25-11-2009 | Отправлено: 18:23 24-10-2011
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
yec

Всего записей: 24106 | Зарегистр. 06-12-2002 | Отправлено: 18:41 24-10-2011
kentuki13

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
akaGM, лол, турбо паскаль. Нет не попутал, нужно то что я описал на масме через вин 32 апи функции. Или пошлешь меня теперь в раздел С/C++ ?
 
Добавлено:
bomzzz, спасибо конечно, но не то, сори затупил что не обьяснил сразу что у меня оконное приложение.

Всего записей: 9 | Зарегистр. 23-10-2011 | Отправлено: 20:54 24-10-2011
bomzzz



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ага я понил. ну можно сделать с ходу не помню как. ты бы подробнее написал или нарисовал что тебе надо

Всего записей: 13343 | Зарегистр. 13-01-2008 | Отправлено: 21:23 24-10-2011
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kentuki13
не, не пошлю...
а вот по линку в шапке послал бы...

Всего записей: 24106 | Зарегистр. 06-12-2002 | Отправлено: 22:09 24-10-2011
kentuki13

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Есть допустим такая строка:
text \
        db 'bla bla bla',0dh,0ah
        db 'bla bla bla',0
 
Нужно нарисовать ее на моем окне, все слова разным цветом. Я так догадываюсь, что можна вывести строку через единый DrawText или TextOut или еще както, а уже потом изменить цвет определенной части отрисованой строки?
 
http://s2.ipicture.ru/uploads/20111024/WuKAK451.jpg

Всего записей: 9 | Зарегистр. 23-10-2011 | Отправлено: 22:22 24-10-2011
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по программированию на Assembler


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru