Запись символа в видеобуфер MASM

Я пытаюсь написать букву «D» синим цветом на белом фоне, переместив ее в видеобуфер. Что не так с этим кодом?

INCLUDE Irvine16.inc

.code
main PROC

mov ax,@data
mov ds,ax

mov si, 0b800h
mov word ptr [si], 44h
mov word ptr [si+2] 0701h

mov ah, 08h
int 21h

exit

main ENDP

Внес изменения в вышеизложенное. Теперь он собирается, но ничего не отображает.


person Daniel    schedule 01.12.2011    source источник
comment
Вы должны публиковать то, что ваш код на самом деле делает, а не только то, что вы ожидаете.   -  person Gabe    schedule 01.12.2011
comment
Это ничего не делает. он не соберется.   -  person Daniel    schedule 01.12.2011
comment
@Daniel: Прошло много лет с тех пор, как я сделал masm, но пробовали ли вы эквивалент ASCII в виде целого числа, то есть десятичного числа 69?   -  person Eric J.    schedule 01.12.2011
comment
Говорить «он не соберется» особенно бесполезно. Как насчет того, чтобы опубликовать точный вывод ошибки, который вы получаете?   -  person Gian    schedule 01.12.2011
comment
@Gian, теперь он соберется, но ничего не напечатает.   -  person Daniel    schedule 01.12.2011
comment
@ЭрикДж. Теперь я попробовал эквивалент ASCII. Он сейчас соберется, но ничего не печатает.   -  person Daniel    schedule 01.12.2011
comment
Вас попросили предоставить дополнительную информацию (фактический код, сообщения об ошибках и т. д.), а вы просто продолжаете комментировать сообщения, говорящие одно и то же. Если вам нужна помощь, отредактируйте свой вопрос, чтобы предоставить детали, которые вас просили предоставить; это намного проще (и быстрее), чем играть в 20 вопросов в комментариях. :)   -  person Ken White    schedule 01.12.2011
comment
@KenWhite Хорошо, я опубликовал всю свою программу. Теперь он собирается, но ничего не делает, просто сидит с пустым окном консоли, пока не будет нажата клавиша.   -  person Daniel    schedule 01.12.2011


Ответы (3)


Пример примера:

name "hello-world"
org 100h

; set video mode     
mov ax, 3     ; text mode 80x25, 16 colors, 8 pages (ah=0, al=3) 
int 10h       ; do it! 

; cancel blinking and enable all 16 colors: 
mov ax, 1003h
mov bx, 0
int 10h


; set segment register: 
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], '!'




; color all characters: 
mov cx, 12  ; number of characters. 
mov di, 03h ; start from byte after 'h' 

c:  mov [di], 11101100b   ; light red(1100) on yellow(1110) 
    add di, 2 ; skip over next ascii code in vga memory. 
    loop c

; wait for any key press: 
mov ah, 0
int 16h

ret

Надеюсь, этот образец поможет вам

person Sudhir Bastakoti    schedule 01.12.2011
comment
Да! Спасибо. Я новичок в ассемблере, поэтому делаю глупые ошибки. - person Daniel; 01.12.2011
comment
@Sudhir Bastakoti У меня есть сегмент данных как msg db 10,13,'Enter Sting: $' buffer db 20, и я пытаюсь отобразить содержимое буфера, но он отображает содержимое msg, которое равно Enter String: . - person Ahtisham; 21.11.2017

1) 0b800h — адрес сегмента видеобуфера. mov word ptr [si], 44h обращается только к смещению (здесь: 0b800h) адреса сегмента в DS, а DS не указывает на видеобуфер. Я предлагаю загрузить сегмент видео в ES и использовать переопределение сегмента (ES:).

2) Буква плюс цвет вместе образуют слово. В видеобуфере сначала идет буква, потом цвет. Цвет фона и переднего плана использует каждый кусочек (4 бита). Из-за «маленького порядка следования байтов» (поищите в Google) слово должно иметь формат цвет/буква, например. белый/синий/'D' = 7144h

Это пример, совместимый с Irvine16:

INCLUDE Irvine16.inc
INCLUDELIB Irvine16.lib

.CODE
main PROC
;   mov ax,@data                ; No .DATA in this example
;   mov ds,ax

    mov si, 0b800h              ; Initialize ES with video buffer
    mov es, si

    xor si, si                  ; Position 0 is top left
    mov word ptr es:[si], 7144h ; White background ('7'), blue foreground (1), letter 'D' (44)

    mov ah, 08h                 ; Wait for key - http://www.ctyme.com/intr/rb-2561.htm
    int 21h

    exit                        ; Irvine16: end of program
main ENDP

END main
person rkhb    schedule 21.12.2015

Взгляните на листинг 15 здесь:

http://stuff.pypt.lt/ggt80x86a/asm8.htm

person Eric J.    schedule 01.12.2011