问题描述
我需要根据 8 位二进制数在屏幕上显示 8 个方块。例如,11111111 将打印 8 个方格,而 10000000 将仅打印一个方格。我有一个子程序来打印每个有效的方块。我的问题是我不确定如何迭代二进制值来检查二进制值。如果我使用另一种语言,如 java 或 C,我会使用 for 循环遍历二进制数,检查每个数字是否为 1,如果是 1,则调用该方法打印一个正方形。我怎样才能在组装中做到这一点?使用的值可以来自内存或寄存器,但我不明白如何检查二进制文件中 1 的位置。
解决方法
使用 shl
(或 shr
)一次将一位移出进位。如果 CF=1,则绘制正方形。
如果掩码仍然至少有一个 ON 位(最小化迭代次数),则下一个代码仅循环返回:
mov al,[Mask]
shl al,1
jnc .b
.a:
call DrawSquare
.b:
shl al,1
jc .a
jnz .b
ps:确保 DrawSquare 不会破坏 AL
寄存器。也许使用不同的寄存器。
尝试循环 8 次(假设您使用的是字节值),针对 0x01 的 & 掩码测试每一次以决定是否打印框,然后在进入循环的下一次迭代之前进行移位。伪代码如下:
for 0..7
if value & 0x01 == 0x01: print box
value = value >> 1