win一、计算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,并真确设置环境变量)
五、win32汇编(在win10 64位下可执行)
需要下载masm32,解压到d:根目录下:
设置环境:var.bat
@echo off
set include=D:\masm32\include
set lib=D:\masm32\lib
set path=D:\masm32\bin;%path%
echo on
计算2^12的win32汇编代码:
.386
.model flat, stdcall
include \masm32\include\msvcrt.inc
includelib \masm32\lib\msvcrt.lib
.data
szFmt db '2^12=%d;', 0
.code
start:
mov eax, 0
mov ax,1 ;初始化AX
mov ecx, 0 ;初始化循环次数,设为12次
mov cx,12
s:
add ax,ax
loop s ;执行完loop后,要显示的数字2^12 已经在寄存器AX
invoke crt_printf, addr szFmt, eax
ret
end start
汇编,并运行:
D:\masm32\MyPrg>type var.bat
@echo off
set include=D:\masm32\include
set lib=D:\masm32\lib
set path=D:\masm32\bin;%path%
echo on
D:\masm32\MyPrg>var
D:\masm32\MyPrg>ml /coff 5_1.asm /link /subsystem:console
Microsoft (R) Macro Assembler Version 6.14.8444
Copyright (C) Microsoft Corp 1981-1997. All rights reserved.
Assembl