装配二维像素阵列

时间:2014-07-05 10:30:21

标签: arrays assembly pixels

我怎么能在装配中做这样的事情? DOS 16位图形模式

int start_x=1, start_y=1;
for(int i=0; i<8; i++){
    for(int j=0; j<8; j++){
        if(T34[i][j]==1) put_colour_pixel(start_x+i, start_y+j);
        else put_black_pixel(start_x+i, start_y+j);
    }
}

:编辑:

所以我的循环很有效。如何使用0和1将其连接到表。

mov ax, 10 ; Y start line
    mov bx, 20 ; X start line
    mov dl, 4  ; colour (red)
    mov cx, 5 ; loop top counter
    top:
        add ax, 1
        push cx ;loop top counter
        mov cx, 10
        inside:
        add bx, 1

        push ax
        push bx
        push cx

        call putpixel

        pop cx
        pop bx
        pop ax
        loop inside
        mov bx, 20 ;next line X go to start X

        pop cx ;loop top counter

    loop top

/////////////////////////////////////////////// ////////////////////////////////////////// ////////////////////////////////////////////////// /////////////////////////////////////// ////////////////////////////////////////////////// /////////////////////////////////////// 我的新代码:

    segment .data

    segment .code
..start:
    mov ax, 13h 
    int 10h               ; switch to 320x200 mode

    mov ax, 0a000h        ; The offset to video memory
    mov es, ax            ; We load it to ES through AX,
                          ; because immediate operation
                          ; is not allowed on ES

;;;;;;;;;;;;;;;;;;;;;;

       mov di, T34
       mov si, 8
;------------------------------------
P1:    mov bp, 8

;----------------
P2:    cmp BYTE[di], 1
       jnz short NOHIT

NOHIT: ; increase the x position

        push ax
       push bx
       push cx
       mov ax,si ;Y
       mov bx,bp ;X
       mov dl, 1 ; here I should take '0' or '1' from table
       call putpixel
       pop cx
       pop bx
       pop ax

       inc di  ; increase offset address of array
       dec bp
       jnz P2
;-------------
       ; increase the y position + substract 8 from x position
       dec si
       jnz P1
;------------------------------------


;;;;;;;;;;;;;;;;;;;;;;;;;

    xor ah, ah
    int 16h               ; keyboard (wait for key)

    mov ax, 3
    int 10h               ; go to text mode

    mov ax, 4c00h
    int 21h               ; return to DOS, exit code 0

;;;;;;;;;;;;;;;;;;;;;

putpixel:
    push dx               ; mul changes dx too
    mov cx, 320
    mul cx                ; multiply Y (ax) by 320 (one row)
    add ax, bx            ; and add X (bx) (result= dx:ax)
    mov di, ax
    pop dx
    mov [es:di], dl       ; store color/pixel
    ret

;;;;;;;;;;;;;;;;;;;;;;

T34 DB 1,1,1,1,1,1,1,1
    DB 1,0,0,0,0,0,0,0
    DB 1,0,0,0,0,0,0,0
    DB 1,0,0,0,0,0,0,0
    DB 1,1,1,1,1,1,1,1
    DB 1,0,0,0,0,0,0,0
    DB 1,0,0,0,0,0,0,0
    DB 1,1,1,1,1,1,1,1

我已经改变了顺序,现在它正在左角绘制正方形(正如我所料)。我改变了订单吗? 我想这封信会被调整,但这对我来说不是问题。我可以稍后解决。

现在我应该在表格中输入'0'或'1'并设置颜色。哪个寄存器有“0”或“1”?

所以大多数情况下我都有颜色问题。 我试过这个,但我有错误。我尝试设置颜色黑色(0)或蓝色(1)

 push dx
   mov ax, bp ; X*8
   mov cx,8
   mul cx
   add ax, si ; X*8 +Y

   add ax, di ; tab0 + X*8+Y

   mov dl,  ax; here is error, here I set the colour
   pop dx

所以我不知道如何解决它:(我尝试了不同的可能性和北方工作。

1 个答案:

答案 0 :(得分:0)

       mov di, T34
       mov si, 8
;------------------------------------
P1:    mov bp, 8
;----------------
P2:    cmp BYTE[di], 1
       jnz short NOHIT

       ; save used REGISTER
       ; load register with the X,Y position and color
       call putpixel
       ; get back the saved Register

NOHIT: ; increase the x position
       inc di  ; increase offset address of array
       dec bp  ; decrease counter and set zeroflag if register is zero
       jnz P2  ; jump if zeroflag is not set
;-------------
       ; increase the y position + substract 8 from x position
       dec si
       jnz P1
;------------------------------------

也可以用0来启动循环的计数器以增加计数器,但是如果我们想要从0到8运行循环,那么我们需要一个比较指令来离开循环。偏移地址数组内部是独立的,与计数器无关。

稍微修改(在代码和第二次调用中添加一个额外的跳转指令)如果数组的字节为0,也可以设置黑色像素。但我认为嵌套循环的这种简单形式是第一次更容易理解。

编辑:现在它与NASM兼容。


Edit2:如果正在使用许多参数,可能更简单的是将x,y坐标存储到已知的ram位置以便在循环内部进行修改和重新加载。

我们的公司位置:

Color DB ?  ; define byte
X_Pos DW ?  ; define word
Y_Pos DW ?

显示如何访问内存位置的示例(默认段为DS):

mov [X_Pos], ax
mov [X_Pos], bx  
mov [Color], dl  
mov ax, [X_Pos]
mov bx, [Y_Pos]
mov dl, [Color]

mov WORD[X_Pos], 10
inc WORD[X_Pos]
sub WORD[X_Pos], 8
mov BYTE[Color], 4
inc BYTE[Color]

EDIT3:

mov dl,  ax; here is error, here I set the colour

无法将8位寄存器与16位寄存器混用。 注意:

AX = AL+AH
DX = DL+DH

现有说明如下:

mov dl,  al
mov dl,  ah
mov dx,  ax
movzx dl, ax