一、计算2^12保存在AX中(王爽汇编语言第二版p100):

		mov  	cx,12		;循环12次
		mov     ax,1		;初始化AX
s:		add		ax,ax
		loop  	s			;执行完loop后,要显示的数字2^12 已经在寄存器AX

二、AX寄存器以显示说明:

本例中,2^12=4096,故AX=1000H

则输出字符为4096

原理:
ax为十六位寄存器,所以输出十进制数范围为0 - 65535,最大五位数,故设置CX=5,LOOP语句实现算法:
4096/10000= 商0  余数4096    ; 根据十进制书写习惯,不输出前面的0字符 ,需要在输出循环里判断
4096/1000= 商4  余数96         ;输出4
96/100= 商0  余数96              ;输出0
96/10=  商9  余数6                 ;输出9
6/1=  商6  余数0                     ;输出6
把每次所得商加上48即可得到相应数字的ASCII码,

三、完整代码:


code segment
assume cs:code,ds:data,ss:stack
start:
        mov     ax,data
        mov     ds,ax

	mov  	cx,12		;循环12次
	mov     ax,1		;初始化AX
s:	add		ax,ax
	loop  	s			;执行完loop后,要显示的数字2^12 已经在寄存器AX

        mov     si, offset divisors
        mov     di, offset results
        mov     cx,5
aa:
        mov     dx,0
        div     word ptr [si]   ;除法指令的被除数是隐含操作数,此处为dx:ax,商ax,余数dx
        add     al,48           ;商加上48即可得到相应数字的ASCII码
        mov     byte ptr [di],al
        inc     di
        add     si,2
        mov     ax,dx
        loop    aa
        mov     cx,4
        mov     di, offset results
bb:
        cmp     byte ptr [di],'0'   ;不输出前面的0字符
        jne     print
        inc     di
        loop    bb
print:
        mov     dx,di
        mov     ah,9
        int     21h
        mov     ax,4C00h
        int     21h
code ends
data    segment
divisors        DW 10000, 1000, 100, 10, 1
results          DB 0,0,0,0,0,"$"        ;存放五位数ASCII码
data ends
stack segment STACK
stack ends
end start

四、DOSBOX运行截图(dosbox已安装masm611,并真确设置环境变量)

汇编语言计算2^12保存在AX寄存器,并以十进制形式输出-LMLPHP

06-16 13:03