x86-16汇编随机行号生成问题:寄存器不匹配及替代方案需求
问题解决方法
核心问题分析
原代码中div cx执行后,余数存储在16位寄存器DX中,但由于除数(比如10或25)远小于256,余数只会占据DX的低8位DL,高8位DH必然为0。直接将DX赋值给8位寄存器BL会导致汇编错误,只需提取DL的值即可得到符合要求的8位随机数。
修改后的随机数生成代码
random_number: mov ah, 00h ; 调用BIOS中断获取系统时间 int 1Ah ; CX:DX 存储午夜以来的时钟滴答数 mov ax, dx ; 以DX的滴答数作为随机种子 xor dx, dx mov cx, 25 ; 除数设为25,生成0-24的行号(适配文本模式25行) div cx ; 余数存于DX,此时DH=0,DL为0-24的有效随机值 mov bl, dl ; 将8位余数存入BL,避免干扰AH/AL寄存器 ret
关键说明
- 余数的有效位:因为除数(如25)小于256,计算出的余数范围是0到除数-1,远小于256,所以DX的高8位DH始终为0,实际有效数据在DL中,直接取DL赋值给8位寄存器BL完全合法。
- 行号范围调整:如果只需要0-9的行号,保持
mov cx,10即可,核心逻辑不变。 - 寄存器兼容性:使用BL存储随机数,不会影响后续
int 10h ah=13h调用所需的AH/AL寄存器参数。
原打印函数无需修改
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
内容的提问来源于stack exchange,提问作者SGD
相关产品推荐
相关产品推荐

