我正在尝试在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
我是从教程中得到的,但我知道它为什么不起作用。 这段代码有什么问题?我试图显示两个像素。 感谢您的帮助:)
答案 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!)