Assembly 部件:无法在图形模式下绘制正方形

Assembly 部件:无法在图形模式下绘制正方形,assembly,graphics,x86,nasm,Assembly,Graphics,X86,Nasm,我在assembly中编写了该代码: [bits 16] [org 0x7c00] mov ah, 0 ; mov al, 13h ; set graphic mode int 10h ; mov cx, sx mov dx, sy mov ah, 0ch colcount: inc cx int 10h cmp cx, hh jne colcount mov cx, sx inc dx cmp dx, ww jne colcount ;;; va

我在assembly中编写了该代码:

[bits 16]
[org 0x7c00]

mov ah, 0   ;
mov al, 13h ; set graphic mode
int 10h     ; 

mov cx, sx 
mov dx, sy  
mov ah, 0ch 

colcount:
inc cx
int 10h
cmp cx, hh
jne colcount

mov cx, sx  
inc dx      
cmp dx, ww
jne colcount

;;; vars section
sx dd 0     ;start x position
sy dd 0     ;start y position
hh dd 30    ;height
ww dd 30    ;width

times 510 - ($ - $$) db 0x0
dw 0xaa55
我希望这个代码在屏幕的左上角画一个正方形,但是它只在中间画出一个ReCt。 我不知道问题出在哪里。
我使用nasm作为编译器,没有任何错误消息。

我从中提取了部分代码,谢谢。

mov-cx,sx
cx
设置为
中定义的dword的第一个字节的内存地址;;;vars部分
。也就是说,它将类似于
cx=0x7C20
(只是猜测“vars”前面的代码大小)。要从内存中读取值0,必须将其标记为内存访问,如
mov-cx,[sx]
。。。这同样适用于cmp cx、hh等。。。如果您将其与MASM或TASM组合在一起,它将按预期工作(但是
[bits 16]
是NASM语法,在MASM/TASM中不起作用)。您需要为正在使用的汇编器选择正确的语法。此外,跳转
jne colcount
,当设置零标志(“等于”为true)时,CPU将读取内存中的下一个字节作为指令并尝试执行它。
sx dd 0
将被解码为
add[bx+si],al
,修改以
bx
si
中的当前值为目标的一些不相关的内存块。如果您试图编写测试引导加载程序,希望观察最终结果,那么可以使用一些无限循环,如
jmp$-2
。而且您当前的代码与引导加载程序没有任何关系,所以为什么不在更友好的环境中使用一些调试器来练习汇编基础知识呢?您可以尝试下面答案中的示例代码,它不仅解析正方形图形,还解析动画,并在引导加载程序中使用NASM(虽然我自己从来没有像DOS程序一样,作为引导加载程序对它进行过真正的测试):(但它没有使用BIOS服务来绘制像素,它直接写入VRAM,所以它可能会让您有点困惑,如果您试图解释它是如何工作的,将需要更多的努力)