一、计算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,并真确设置环境变量)