【问题标题】:counting bits (1s) in an 8 bit number计数 8 位数字中的位 (1)
【发布时间】:2015-03-05 21:56:15
【问题描述】:

所以在我的程序的一部分是汇编语言中,我必须创建一个随机的 8 位数字,其中只有 3 个...所以我创建了 8 位随机数,但我无法弄清楚如何确定它是否有 3 个,如果没有,我可以创建另一个并再次检查。直到它只有 3 个。到目前为止,除了“汉明重量”之外,我还没有在网上找到任何有用的东西。但由于我不熟悉汇编语言,我无法弄清楚如何对其进行编码。 这是我目前根据课堂笔记所掌握的内容

rand8:  mov a, rand8reg ;puts the 1 bit of memory in a
    jnz rand8b      ;if it is 0 it will jump to the next loop
    cpl a           ;takes compliment of the number
    mov rand8reg, a
rand8b: anl a, #10111000b
    mov c, p
    mov a, rand8reg
    rlc a
    mov rand8reg, a

    mov r0, #30h
cloop2: mov a, @r0
    mov r2, #8
cloop1: rlc a
    jnc nocy
    inc 20h

nocy:   djnz r2, cloop1
    inc r0
    cjne r0,#40h,cloop2
    ljmp randloop

【问题讨论】:

  • 你考虑过位移吗?
  • 解决此问题的更好方法是只生成您想要的数字(例如,通过查找表)。或者从 0-7 生成三个数字并设置这些位。不要只是生成和测试。
  • @BethCrane 我相信这就是我试图用 cloop1 中的 rlc(旋转)做的事情

标签: assembly counting 8051


【解决方案1】:

这就是我在 C 中的做法:

int main() { 
int v = 3; // count the number o ...
int c = 0; // c accumulates th ...

while (v) 
{ 
    c += v & 1; 
      v >>= 1; 
} 
} 

这会产生如下汇编代码:

main:
   PUSH %BP
   MOV  %SP, %BP
@main_body:
   SUB  %SP, $4, %SP
   MOV  $3, -4(%BP)
   SUB  %SP, $4, %SP
   MOV  $0, -8(%BP)
@while0:
   CMP  -4(%BP), 0
   JEQ  @false0
@true0:
   AND  -4(%BP), $1, %0
   ADD  -8(%BP), %0, %0
   MOV  %0, -8(%BP)
   SHR  -4(%BP), $1, %0
   MOV  %0, -4(%BP)
   JMP  @while0
@false0:
@exit0:
@main_exit:
   MOV  %BP, %SP
   POP  %BP
   RET 

我使用这个网站来帮助我编写程序集,它很好地解释了它: http://ctoassembly.com/

【讨论】:

  • 尝试访问网站时出现此错误--->Forbidden. You don't have permission to access /cgi-bin/ on this server.
【解决方案2】:

解决此问题的方法:查看数字的每一位并将其与 0 异或并将结果添加到计数器:如果值为 != 3,请重试。

This 给出了如何做到这一点的想法,XOR 当然不是唯一的方法,你会增加一个计数器而不是打印到屏幕上。这也是非常低效的。

【讨论】:

  • 哦,我明白了。我将如何处理一个数字的每一位?
  • 编辑了回复,链接应该可以帮助你。有一个包含单个 1 的变量。每次将其旋转一步并执行按位运算。如果结果数字为零,您就知道与 1 对齐的空间是什么,然后可以根据它采取行动。
  • 谢谢,我去看看
【解决方案3】:

不使用循环的另一种可能性:

COUNT_1BITS:
; Calculate number of 1 bits in A
; Return number in A

XCH A,R0
PUSH ACC   ; Save old R0 value to stack
XRL ACC,A  ; Clear A
XCH A,R0   ; Fetch value and clear counter

RRC A      ; Move bit0 to C
XCH A,R0   ; Save A, fetch counter
ADDC A,#0  ; Count Bit 0
XCH A,R0   ; Save counter, fetch A

RRC A      ; Move bit1 to C
XCH A,R0   ; Save A, fetch counter
ADDC A,#0  ; Count Bit 1
XCH A,R0   ; Save counter, fetch A

RRC A      ; Move bit2 to C
XCH A,R0   ; Save A, fetch counter
ADDC A,#0  ; Count Bit 2
XCH A,R0   ; Save counter, fetch A

RRC A      ; Move bit3 to C
XCH A,R0   ; Save A, fetch counter
ADDC A,#0  ; Count Bit 3
XCH A,R0   ; Save counter, fetch A

RRC A      ; Move bit4 to C
XCH A,R0   ; Save A, fetch counter
ADDC A,#0  ; Count Bit 4
XCH A,R0   ; Save counter, fetch A

RRC A      ; Move bit5 to C
XCH A,R0   ; Save A, fetch counter
ADDC A,#0  ; Count Bit 5
XCH A,R0   ; Save counter, fetch A

RRC A      ; Move bit6 to C
XCH A,R0   ; Save A, fetch counter
ADDC A,#0  ; Count Bit 6
XCH A,R0   ; Save counter, fetch A

RRC A      ; Move bit7 to C
XCH A,R0   ; Save A, fetch counter
ADDC A,#0  ; Count Bit 7
XCH A,R0   ; Save counter, fetch A

POP ACC    ; Fetch old R0 value
XCH A,R0   ; Exchange A and R0

; Now the number of 1 bits is in A 
; and R0 has its previous value again

RET

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-04
    • 2015-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多