所以在我的汇编语言程序的一部分,我必须创建一个随机的8位数,其中只有3个1…所以我创建了一个8位随机数,我很难弄清楚它是否有3个1,如果没有,我可以创建另一个并再次检查。直到它只有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发布于 2015-03-06 06:09:15
解决这个问题的一种方法是:查看数字的每一位并将其与0进行异或运算,然后将结果添加到计数器中:如果值为!= 3,则重试。
This给出了如何做到这一点的想法,异或当然不是唯一的方法,你可以递增一个计数器,而不是打印到屏幕上。这也是非常低效的。
发布于 2015-03-06 06:13:14
这就是我在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/
发布于 2015-05-31 21:40:42
另一种不使用循环的可能性是:
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
REThttps://stackoverflow.com/questions/28888528
复制相似问题