assembly 在Assembler中绘制直线而不是正方形

fjaof16o  于 2023-04-30  发布在  其他
关注(0)|答案(1)|浏览(145)

而不是显示一个正方形我有线当我点击向上和向下箭头
任务是这样的。
通过按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
而不是显示一个正方形我有线当我点击向上和向下箭头

ikfrs5lh

ikfrs5lh1#

请告诉我有什么问题?
基本上你是混淆之间的文本视频模式和图形视频模式。
您有一个由星号字符组成的正方形的定义。这种方形对于文本视频模式是典型的。现在,任务似乎要求您使用图形视频模式,而您自己已经在图形屏幕上绘制单个像素。但我也注意到,您希望其中会出现星号字符!不会发生的。

故障列表

1draw_square 中,不清楚您希望第一个DOS调用做什么。

第二个DOS调用(显示初始正方形)取决于要以**$**结尾的正方形的定义:

square db 13,10, "*******"
       db 13,10, "*     *"
       db 13,10, "*     *"
       db 13,10, "*     *"
       db 13,10, "*******",13,10,"$"

提示:如果你的方块的定义包含了回车(13)和换行(10)这样的代码,那么在屏幕上移动方块几乎是不可能的。无论您最初将光标定位在哪里,后面的星号都将不可避免地跳回到屏幕的左边缘。你得重新考虑一下。..

2在所有的“移动”代码中,您显然希望输出一个字符(mov al, 42 ; *)。因此,要输出空格字符mov al, 20必须是mov al, 20h

可悲的是,这些都不重要,因为AH中的函数编号设置为0 Ch,这是BIOS函数来绘制单个像素,而不是整个字符!
如何在运行中重新利用寄存器?使用mov bx, 10x 1 m4n1x(位于顶部),您已经初始化了起始列和起始行。但随后出现了mov cx, bx,它将 column 移动到 X 参数中,而mov dx, cx则希望将 row 移动到 Y 参数中,但由于CX寄存器已经被覆盖,所以无法移动!
一个解决方案是在.data部分中为列和行定义两个变量:

TheCol dw 10
TheRow dw 5

然后加载参数

mov cx, TheCol
mov dx, TheRow

3在'exit_program* BIOS中。SetVideoMode调用将(尝试)设置随机视频模式,因为您忘记指定AL。选择模式3,如下所示:

exit_program:
    mov ax, 0003h
    int 10h

相关问题