我是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。
我愿意接受任何建议,提前谢谢。
您应该充分利用and
、cmp
和shr
指令。查找并试用它们。
总的来说,你的代码会有这样的结构:
- 将
BR
值复制到工作寄存器(,例如、bx
) - 检查01的最低两位,如果是,则递增计数器
- 将工作寄存器右移一位
- 转到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
指令。循环将继续移位一位,直到用完工作寄存器中的所有位。