16位x86汇编程序,使用8位内存存储变量的颜色绘制蓝屏到屏幕的麻烦?

时间:2017-07-30 03:15:15

标签: assembly memory nasm dos x86-16

以下代码在 Xubuntu 16.04 上编译并运行正常 这些命令位于 bash shell

nasm blue.asm -fbin -oblue.com

dosbox ./blue.com -exit

我遇到的问题是在第20行 mov al, 1;byte [blue]

如果我改用它 mov al, byte [blue]

该程序在屏幕上绘制了一种勃艮第而不是蓝色。它通常用于使用 1 ,这是8位调色板中的颜色代码https://en.wikipedia.org/wiki/BIOS_color_attributes

这里是完整的代码,如果有任何其他问题,请随时告诉我。

org 00h
bits 16       

section .data             

    blue:    db       1  

section .text
MAIN:

AsyncKeyInput:      

    mov     al, 13h
    int     10h
    ; Segment a000h
    mov     ax, 0a000h
    mov     es, ax
    ; Offset 0
    xor     di, di
    mov     al, 1;byte [blue]
    ; Looplength (320*200)/2 = 7d00
    mov     cx, 7d00h

hplot:
    mov [ es: di], al       ;set pixel to colour
    inc di          ;move to next pixel
    loop hplot      

    mov     ah, 1          ;Get the State of the keyboard buffer
    int     16h            ;key press
    jz      AsyncKeyInput ;if not zero then exit the program 

    ;exit program
    mov eax, 1
    mov ebx, 0
    int 0x80
ret 

1 个答案:

答案 0 :(得分:2)

问题的解决方案是为com程序正确设置程序段前缀为org 100h。以下是更正后的代码。

org 100h
bits 16       

section .data             

    blue:    db       1h     

section .text
MAIN:

AsyncKeyInput:      

    mov     al, 13h
    int     10h
    ; Segment a000h
    mov     ax, 0a000h
    mov     es, ax
    ; Offset 0
    xor     di, di
    xor     eax, eax
    mov     al, byte [blue]
    ; Looplength (320*200)/2 = 7d00
    mov     cx, 7d00h

hplot:
    mov [ es: di], al       ;set pixel to colour
    inc di          ;move to next pixel
    loop hplot      

    mov     ah, 1          ;Get the State of the keyboard buffer
    int     16h            ;key press
    jz      AsyncKeyInput ;if not zero then exit the program 

    ;text mode
    mov     ax, 0003h
    int     10h         
ret