微机原理必备程序段Word格式.docx
《微机原理必备程序段Word格式.docx》由会员分享,可在线阅读,更多相关《微机原理必备程序段Word格式.docx(18页珍藏版)》请在冰豆网上搜索。
NT
INT
20H
2.多字节的加法:
有两个4字节的无符号数相加,这两个数分别放在2000H和3000H开始的存储单元中,低位在前,高位在后。
运算后,得到的和放在2000H开始的内存单元中。
MOV
SI,2000H
取第一个数的首地址
MOVAX,[SI]
将第一个数的低16位取到AX
DI,3000H
取第二个数的首地址
ADD
AX,[DI]
两个数的低16位相加。
[SI],AX
低16位相加的结果送到2000H和2001H单元
MOVAX,[SI+2]
取第一个数的高16位送到AX中
ADC
AX,[DI+2]
两个数的高16位连同CF相加
[SI+2],AX
高16位相加的结果送到2002H,2003H单元。
3.多字节组合BCD码十进制加法
设第一个数据在1000H开始的8个内存单元中,第二个数据在2000H开始的8个内存单元中,要求相加之后将结果放在2000H开始的内存区域。
mov
si,1000h
SI指向第一个数据
DI指向第二个数据
cx,8
共有8字节长
c1c
清除进位标志
l1:
a1,[si]
取第一个数据的1个字节
adc
a1,[di]
加上第二个数据的相应字节
daa
对相加结果进行十进制调整
[di],a1
存到指定的内存区域
指向下一个字节
di
jnz
l1
如未算完,则继续
int
20h
返回DOS
4.多字节的移位
使BX所指的四个单元中的四字节数左移1位,
SAL
WORD
PTR
[BX+0],l
RCL
[BX+2],1
5.ASCII码转换为BCD码
设键盘输入的100个十进制数的ASCII码已在首地址DS为3000H,偏移量为0100H的内存区域中,要求把它们转换为组合型BCD码,高地址的放在高半字节。
存入偏移地址为0200H的区域中。
分析:
算法是这样的:
先将较低字节的32H转换为02H,再将较高字节的34H转变为40H,然后将其与02H按位相或成为42H。
循环50次完成50个字节的组合BCD码的转换。
CX,0032H
NEXT:
AL,[SI]
INC
SI
AND
AL,0FH
BL,AL
PUSH
CX
CL,4
SHL
AL,CL
POP
AL,BL
[DI],AL
INC
DI
LOOP
NEXT
INT
6.比较两个字符串
假设两个字符串分别放在DS段(设ES=DS)的str1和str2区域,其长度分别为L1和L2,比较这两个字符串是否相等。
若相等,则置M1单元内容为FFH,否则为00H。
前缀REPZ和REPE表示,当作比较的两字节(或字)相等时继续往下比较直至出现不等,或者CX减为0为止。
重复前缀使用前必须对CX置重复次数。
每比较一次,CX-1→CX(字比较CX-1→CX)。
CX=0表示两个字符串所有字节都比较过了,这时结束比较。
前缀REPNE和REPNZ则表示字节(字)不等时继续往下比较。
LEA
SI,STR1
DI,STR2
CX,L1
CMP
CX,L2
JNE
UNEQ
REPZ
CMPSB
AL,0FFH
JMP
EXIT1
UNEQ:
AL,00H
EXIT1:
M1,AL
7.有条件的数据传送
将从BLOCK1单元开始的100个字节传送到BLOCK2单元开始的区域中,两区域的相对位置不确定。
数据传送过程中遇0DH(回车符)则结束传送。
假设DS=ES,即BLOCK1和BLOCK2同在一个数据段,并且位置不定(BLOCK1值可以大于、小于或等于BLOCK2)。
由于该题要求有条件传送,使用MOVSB指令不如LODSB和STOSB方便。
又因源数据区和目标数据区有可能重叠,所以应区分两种情况分别用地址增量和地址减量的方式来传送。
若源地址大于目的地地址,则应用地址增量方式从首地址开始传送,反之,则应用地址减量方式从末地址开始传送。
LEA
SI,BLOCK1
DI,BLOCK2
MOVCX,100
SI,DI
JE
DONE
JA
DFO
STD
ADD
SI,99
DI,99
JMP
TRAN
DFO:
CLD
TRAN:
LODSB
AL,0DH
STOSB
DONE:
8.确定字符串的长度
在STRING为始地址的字符串中搜索字符串结束符“$”,并将字符串的长度(不包括“$”)放入STRLN单元中;
如果连续100个字节单元之中无“$”符则在STRLN单元中填入0FFH。
目标串搜索指令SCASB和SCASW将AL(或AX)与ES:
DI所寻址的字节(或字)内容进行比较而不改变其值;
只影响标志位SF、ZF、PF、OF、CF、AF,并且修改DI指针使指向目标串中下一个元素。
DI,STRING
AL,‘$’
REPNE
SCANSB
JZ
DONE1
DONE2
DONE1:
BX,100
SUB
BX,CX
DEC
BL
AL,BL
DONE2:
STRLN,AL
另一方法:
MOVAL,‘$’
L1:
AL,[DI]
LOOPNE
L1
JZ
9.求符号数的最大值
设数据区1000H开始的区域中存放着50个字节的符号数。
要求找出其中最大的一个数并存到0FFFH单元。
BX,1000H
AL,[BX]
CX,31H
BX
JGE
L2
L2:
JNE
BX,0FFFH
[BX],AL
注:
如果是无符号数则把JGE
L2换为JAE
L2。
10.两个32位无符号数乘法
32位乘法需要做4次16位乘法,每次都要将部分积相加来实现,相加时则要注意位数对齐。
我们用连续的四个字单元来存放乘积,各部分积应加到适当单元。
data
segment
num1
dw
8000h,8000h
num2
8008h,8000h
mut
dw4
dup(0)
ends
stack
segment
stack’stack’
db100
dup
(’s’)
stackends
code
para
‘code’
assume
cs:
code,
ds:
data,
ss:
stack
proc
far
push
ds
xor
ax,ax
pushax
movax,data
movds,ax
leabx,num1
movax,[bx]
;
b→ax
movsi,[bx+4]
d→si
movdi,[bx+6]
c→di
mul
b*d
[bx+8],ax
部分积1存于积单元中。
[bx+10],dx
ax,[bx+2]
a→ax
mulsi
;
a*d
add
[bx+10],ax
[bx+12],dx
带进位加入积2单元中
ax,[bx]
muldi
b*c
b*c加入积单元
带进位加至部分积3
adcwordptr[bx+14],0
进位加至部分积4
muldi
a*c
add[bx+12],ax
adc[bx+14],dx
ret
sta
endp
end
end
sta
11.
datasegment
x
12
y
?
dataends
stacksegment
stack‘stack’
db
100
(‘s’)
codesegmentpara‘code’
assumecs:
code,ds:
data,ss:
stack
signprocfar
xorax,ax
ax
ax,data
ds,ax
ax,x
and
ax,ax
建立标志
jz
zero
jns
plus
bx,0ffffh
jmp
done
zero:
bx,0
jmpdone
plus:
bx,1
done:
y,bx
sign
sign
12.大散转
根据BUFFER单元的值,转到相应的子程序。
子程序的入口地址存放在转移表BRTAB中。
若BUFFER内容等于n,则转到第n个子程序(n从1~256,0代表256)。
buffer
db3
brtab
0000h,3000h
0100h,3050h
0000h,3090h
0100h,4050h
0000h,6000h
segmentstack‘stack’
100dup(‘s’)
segmentpara‘code’
brch
ax,ax
lea
bx,brtab
al,buffer
al
moav
ah,0
shl
ax,1
AL*2
AL*4
bx,ax
dwordptr[bx]
brch
13.数组求和
假设有一数组求和子程序SUM,试用这个子程序分别求出ARY1和ARY2两个数组的和,结果分别存入SUM1和SUM2字单元中。
aryl
03h,07h,50h,06h,23h,45h,0f6h,0dfh
len1equ
$-ary1
sum1
ary2db33h,44h,55h,12h,78h,89h,0feh,0cdh
len2
equ
$-ary2
sum2
db100dup(’s’)
assumecs:
codc,ds:
data,ss:
ax,data
ds,ax
ax,len1
lea
ax,ary1
push
call
sum
ax,len2
ax,ary2
ret
sum
proc
bp
bp,sp
bx
cx
pushf
cx,[bp+6]
get
array
lenth
bx,[bp+4]
get
offset
address
ax,ax
sum=0
add1:
al,[bx]
ah,0
loop
add1
[bx],ax
popf
pop
ret4
14.阶乘
确定变量NUMB的阶乘,把结果存入变量FNUMB。
变量NUMB的值大于0且小于8。
num
nj
db200dup(’s’)
para‘code’
assume
code,ds:
xorax,ax
a1,num
call
factor
x1:
nj,ax
factorproc
sub
ax,1
fcon
retun
fcon:
x2:
mul
cl
Retun:
factor
14.16进制数转换为ASCII码
CHANGE
MACRO
LOCAL
P1
AL,10
如AL=0BH>
0AH
JL
P1
如AL<
A,则直接加30H
AL,‘A’-‘0’-10
0BH+(41H-30H-10)
P1:
AL,‘0’
0BH+7+30H=42H=‘B’
ENDM
15.8253初始化
8253的OUT2输出2kHz频率波形,负脉冲宽度为1μs。
设CLK2输入1MHz的时钟GATE2接高电平,8253地址04~07H,
MOVAL,0B4H
OUT
07H,AL
写入控制字
MOVAL,0F4H
06H,AL
写入计数值的低8位
AL,01H
OUT06H,AL
写入计数值的高8位
也可以是:
MOVAL,0B5H
二-十进制计数
OUT
07H,AL
06H,AL
A1,05H
500=1F4H
OUT06H,AL
16.中断服务程序的编制
一个中断服务程序需要做的事情只是向端口340H,341H送出0值
POPT_INT
PROC
FAR