程序集 (x86):十六进制数二进制代码中的'01'重复次数



我是Assembly的新手,我的任务是确定16b十六进制二进制代码中01的重复次数。例如:

编号AB34为:1010 1011 00110100

由于01在上面用粗体表示,因此需要对其进行计数,并将其存储在下面代码中的RESULT中。诀窍是只使用逻辑指令,如AND、NOT、OR、XOR、移动(SHL、SHR)、旋转(ROR/RCR、ROL/RCL)和逻辑比较。

这是我所拥有的:

name program
data segment
    BR dw 0AB34H ;
    RESULT db 0
data ends
code segment
    assume CS:code, DS:data
start:
    mov ax, data
    mov ds, ax
    mov ax, BR
    mov cx, 16
    mov bx, 0
lwhile:
    ; something with logical instructions
loop lwhile
    mov RESULT, bl
    mov ah, 4ch
    int 21h
code ends
end start

我假设在循环内部需要完成一些工作,通过一些寄存器(如bx)进行计数,然后移动到RESULT。

我愿意接受任何建议,提前谢谢。

您应该充分利用andcmpshr指令。查找并试用它们。

总的来说,你的代码会有这样的结构:

  1. BR值复制到工作寄存器(,例如bx
  2. 检查01的最低两位,如果是,则递增计数器
  3. 将工作寄存器右移一位
  4. 转到2[这样做15次,因为BR中有16个比特,并且您正在检查比特对]

我把一些细节留给你。步骤2中的部分代码可能如下所示:

    mov  ax, bx        ; Current shifted value of BR
    and  ax, 03h       ; Mask out (zero) all but the lowest two bits
    cmp  ax, 1         ; Check if the lower two bits are 01
    jne  next_bits     ; Jump if nonzero (no, they are not 01)
    ; increment your counter here
next_bits:
    ...

CCD_ 7将检查已经向下移位到较低阶两个比特的当前比特对是否是CCD_。要检查下一对位,请使用shr指令。循环将继续移位一位,直到用完工作寄存器中的所有位。

最新更新