装配像素程序不起作用

时间:2014-07-04 18:07:20

标签: assembly pixel procedure

我正在尝试在DOS NASM上以图形模式启动程序放置像素。 当我不使用它的程序时,它现在只显示一个蓝色像素和两个字母" h"在左角。 我的代码:

segment .data

segment .code
..start:
mov ax, 13h 
int 10h

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

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

mov ax, 10 ; Y coord
mov bx, 20 ; X coord
mov dl, 4
call putpixel

mov ax, 1 ; Y coord
mov bx, 2 ; X coord
mov dl, 4
call putpixel
;;;;;;;;;;;;;;;;;;;;;;;;;


;;;;;;;;;;;;;;;;;;;;;
putpixel: 
mov cx,320
mul cx; multiply AX by 320 (cx value)
add ax,bx ; and add X
mov di,ax
mov [es:di],dl
ret
;;;;;;;;;;;;;;;;;;;;;;


xor ah, ah
int 16h ;keyboard

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

mov ax, 4c00h
int 21h 

我是从教程中得到的,但我知道它为什么不起作用。 这段代码有什么问题?我试图显示两个像素。 感谢您的帮助:)

1 个答案:

答案 0 :(得分:0)

您的代码可以正常设置两个像素,但会落入putpixel子例程,造成严重破坏。

我已重新安排您的代码,以便正确完成。要么将子程序放在最后,要么是第一个,要么将jmp放在它们周围。 (我通常先用,所以主逻辑(start,main,等等)是源代码的最后一个。当然是你的选择)

    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 ax, 10            ; Y coord
    mov bx, 20            ; X coord
    mov dl, 4
    call putpixel

    mov ax, 1             ; Y coord
    mov bx, 2             ; X coord
    mov dl, 4
    call putpixel

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

    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               ; oops, 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

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

祝贺你解决汇编语言问题!这并不总是那么容易,但我发现探索它真是太有趣了!祝你好运!


编辑:

糟糕!完全忘了mul命令影响DX

mul cx  -->  dx:ax = ax * cx  (oops!)