如何使用 TASM 迭代 x86 程序集中的二进制值?

问题描述

我需要根据 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