而不是显示一个正方形我有线当我点击向上和向下箭头
任务是这样的。
通过按F1键,它在图形模式下绘制一个正方形。使用箭头键,可以在屏幕上移动正方形。另一个键F2 TSR -程序被卸载。
请告诉我有什么问题?也许有任何类似的例子,那么我会很高兴。
通过DOSBox masm编译项目
.386
.model small
.stack 100h
.data
square db 13,10, "*******",13,10, "* *",13,10, "* *",13,10, "* *",13,10, "*******",13,10
left_arrow equ 4bh
right_arrow equ 4dh
up_arrow equ 48h
down_arrow equ 50h
f1_key equ 3bh
f2_key equ 3ch
.code
start:
mov ah, 0
mov al, 13h
int 10h
mov si, offset square
mov bx, 10
mov cx, 5
wait_for_key:
mov ah, 0
int 16h
cmp ah, f1_key
je draw_square
cmp ah, f2_key
je exit_program
cmp ah, left_arrow
je move_left
cmp ah, right_arrow
je move_right
cmp ah, up_arrow
je move_up
cmp ah, down_arrow
je move_down
jmp wait_for_key
draw_square:
mov ah, 9
mov dx, 0
mov cx, 5
int 21h
mov dx, offset square
mov ah, 9
int 21h
jmp wait_for_key
move_left:
cmp bx, 10
jle wait_for_key
mov ah, 0ch
mov al, 20
mov cx, bx
mov dx, cx
dec cx
mov bx, cx
int 10h
mov ah, 0ch
mov al, 42 ; *
mov cx, bx
mov dx, 5
int 10h
jmp wait_for_key
move_right:
cmp bx, 70
jge wait_for_key
mov ah, 0ch
mov al, 20
mov cx, bx
mov dx, cx
inc cx
mov bx, cx
int 10h
mov ah, 0ch
mov al, 42 ; *
mov cx, bx
mov dx, 5
int 10h
jmp wait_for_key
move_up:
cmp cx, 5
jle wait_for_key
mov ah, 0ch
mov al, 20
mov dx, cx
mov bx, dx
dec cx
int 10h
mov ah, 0ch
mov al, 42 ; *
mov cx, bx
mov dx, cx
int 10h
jmp wait_for_key
move_down:
cmp cx, 20
jge wait_for_key
mov ah, 0ch
mov al, 20
mov dx, cx
mov bx, dx
inc cx
int 10h
mov ah, 0ch
mov al, 42 ; *
mov cx, bx
mov dx, cx
int 10h
jmp wait_for_key
exit_program:
mov ah, 0
int 10h
mov ah, 4ch
mov al, 0
int 21h
end start
enter image description here
而不是显示一个正方形我有线当我点击向上和向下箭头
1条答案
按热度按时间ikfrs5lh1#
请告诉我有什么问题?
基本上你是混淆之间的文本视频模式和图形视频模式。
您有一个由星号字符组成的正方形的定义。这种方形对于文本视频模式是典型的。现在,任务似乎要求您使用图形视频模式,而您自己已经在图形屏幕上绘制单个像素。但我也注意到,您希望其中会出现星号字符!不会发生的。
故障列表
1在 draw_square 中,不清楚您希望第一个DOS调用做什么。
第二个DOS调用(显示初始正方形)取决于要以**$**结尾的正方形的定义:
提示:如果你的方块的定义包含了回车(13)和换行(10)这样的代码,那么在屏幕上移动方块几乎是不可能的。无论您最初将光标定位在哪里,后面的星号都将不可避免地跳回到屏幕的左边缘。你得重新考虑一下。..
2在所有的“移动”代码中,您显然希望输出一个字符(
mov al, 42 ; *
)。因此,要输出空格字符mov al, 20
必须是mov al, 20h
。可悲的是,这些都不重要,因为AH中的函数编号设置为0 Ch,这是BIOS函数来绘制单个像素,而不是整个字符!
如何在运行中重新利用寄存器?使用
mov bx, 10
x 1 m4n1x(位于顶部),您已经初始化了起始列和起始行。但随后出现了mov cx, bx
,它将 column 移动到 X 参数中,而mov dx, cx
则希望将 row 移动到 Y 参数中,但由于CX寄存器已经被覆盖,所以无法移动!一个解决方案是在
.data
部分中为列和行定义两个变量:然后加载参数
3在'exit_program* BIOS中。SetVideoMode调用将(尝试)设置随机视频模式,因为您忘记指定AL。选择模式3,如下所示: