注册 登录
编程论坛 汇编论坛

数的累加1+2+4+8+。。。。1024

syuanq 发布于 2006-12-18 13:47, 2578 次点击
数的累加1+2+4+8+。。。。1024 谢谢指点!
9 回复
#2
lefttime2006-12-18 14:01

因为被加的数都是2的次方关系,所以采用左移方式,这样效率也比较高
累加片段:
MOV CX,10 ;楼主给出的最大数为2的10次幂,所以计数到最大为10
MOV AX,0 ;AX暂且为累加的寄存器
MOV BX,1 ;用于左移,初始值为1,即2的0次幂
NEXT: ADD AX,BX
SHL BX,1 ;采用逻辑左移 (BX)←(BX)*2
LOOP NEXT

#3
3037709572006-12-19 18:13
我觉得还应该注意的一个问题是计算结果的存放,应该先笔算一下结果,然后选择合适的变量或寄存器来存放结果!
#4
lefttime2006-12-19 18:31
16位足够啦
试想下,最高才10位
1+2+4+...+1024不就是下面二进制数逻辑或运算么

0000000000000001
0000000000000010
0000000000000100
......
0000010000000000

结果不会溢出
#5
3037709572006-12-19 19:41

呵呵!是啊 !我也是刚计算完才知道的!

#6
曾小2006-12-21 19:30
厉害!!!!!!
#7
syuanq2007-01-19 21:18
请问要怎样实现输出啊?结果要怎么输出呢?
#8
流浪_汉2007-01-20 11:18
可以查看寄存器
要是输出的话可以每4位的看是不是大于9
转化为ASCII码来输出
#9
syuanq2007-01-20 18:30

可以写出程序来吗?

#10
流浪_汉2007-01-22 12:14
上次没有认真的想,随便说了一下。今天想了想,是要把16位转换为10为才可以的
程序是下面的,我也是刚刚学,可能很麻烦,高贵参考。希望大家也说说自己的想法
stack segment stack'stack'
dw 32 dup(0)
stack ends
data segment
buff db 10,0 ,10 dup(0)
data ends
code segment
main proc far
assume ss:stack,cs:code,ds:data
push ds
mov ax,0
push ax
mov ax,01h
mov bx,01h
mov si,01h
lop:shl bx,1
add ax,bx //加的到结果
cmp bx,0400h
jne lop
mov cx,1000 //得到千位
mov dx,0
div cx
mov buff[si],al
mov ax,dx
mov cx,100 //得到百位
mov dx,0
div cx
inc si
mov buff[si],al
mov ax,dx
mov dx,0
mov cx,10 //得到十位
div cx
inc si
mov buff[si],al
inc si
mov buff[si],dx //存个位
inc si
mov buff[si],'$'
mov si,1
xianshi: mov al,buff[si] //显示结果
cmp al,'$'
je next
add al,30h
mov dl,al
mov ah,2
int 21h
inc si
jmp xianshi
next:mov ah,4ch
int 21h
main endp
code ends
end main
1