首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >计数8位数中的位(1)

计数8位数中的位(1)
EN

Stack Overflow用户
提问于 2015-03-06 05:56:15
回答 3查看 3.7K关注 0票数 0

所以在我的汇编语言程序的一部分,我必须创建一个随机的8位数,其中只有3个1…所以我创建了一个8位随机数,我很难弄清楚它是否有3个1,如果没有,我可以创建另一个并再次检查。直到它只有3个。到目前为止,我还没有在网上找到任何有用的东西,除了“汉明体重”。但由于我不熟悉汇编语言,我想不出如何编写它。这是到目前为止我根据课堂上的笔记所做的。

代码语言:javascript
复制
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
EN

回答 3

Stack Overflow用户

发布于 2015-03-06 06:09:15

解决这个问题的一种方法是:查看数字的每一位并将其与0进行异或运算,然后将结果添加到计数器中:如果值为!= 3,则重试。

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

票数 0
EN

Stack Overflow用户

发布于 2015-03-06 06:13:14

这就是我在C中如何做的:

代码语言:javascript
复制
int main() { 
int v = 3; // count the number o ...
int c = 0; // c accumulates th ...

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

这会生成如下汇编代码:

代码语言:javascript
复制
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/

票数 0
EN

Stack Overflow用户

发布于 2015-05-31 21:40:42

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

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28888528

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档