我正在使用典型的 x86-16 汇编随机数生成器,使用 BIOS 计时器和当前毫秒。
random_number:
mov ah, 00h ; interrupts to get system time
int 1Ah ; CX:DX now hold number of clock ticks since midnight
mov ax, dx
xor dx, dx
mov cx, 10
div cx ; here dx contains the remainder of the division - from 0 to 9
mov bl, dx
ret
我使用它来在函数中在屏幕的随机行中打印字符串:
generate_enemies:
mov ah, 0x13
mov al, 0x01
mov bh, 0
mov bl, 0x07
mov cx, 1
mov bp, enemy_pixel
mov dh, bl
mov dl, 79
int 0x10
ret
问题在于:
移动 bl, dx
因为我需要将数字放入与 dh 大小匹配的寄存器中,当然,bl 不是这种情况。也不能是 al 或 ah,因为它会干扰 int 10h ah 13h 函数。仅供您参考,我使用 fasm 作为汇编程序,并在 qemu-system-x86_64 上运行它。
编辑
我刚刚意识到问题在于,存储除法余数的 dx 寄存器是 16 位大小,而直观上 dh 和 dl 的大小都是 8 位。因此,尝试将 dx 寄存器的值用作 dh 寄存器的行,在这种设置下根本是不可能的。所以我需要一种替代方法来获取行的随机数。