以8位数计数位(1)

时间:2015-03-05 21:56:15

标签: assembly counting 8051

所以在我的程序的一部分是汇编语言,我必须创建一个随机的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

3 个答案:

答案 0 :(得分:0)

解决这个问题的方法:查看数字的每一位,然后将其与0相加,并将结果添加到计数器中:如果值为!= 3,请再试一次。

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

答案 1 :(得分:0)

这就是我在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/

答案 2 :(得分:0)

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

stepsize