Assembly 部件:无法在图形模式下绘制正方形
我在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
[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,所以它可能会让您有点困惑,如果您试图解释它是如何工作的,将需要更多的努力)