微机原理必备程序段Word格式.docx

上传人:b****6 文档编号:21503446 上传时间:2023-01-30 格式:DOCX 页数:18 大小:20.71KB
下载 相关 举报
微机原理必备程序段Word格式.docx_第1页
第1页 / 共18页
微机原理必备程序段Word格式.docx_第2页
第2页 / 共18页
微机原理必备程序段Word格式.docx_第3页
第3页 / 共18页
微机原理必备程序段Word格式.docx_第4页
第4页 / 共18页
微机原理必备程序段Word格式.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

微机原理必备程序段Word格式.docx

《微机原理必备程序段Word格式.docx》由会员分享,可在线阅读,更多相关《微机原理必备程序段Word格式.docx(18页珍藏版)》请在冰豆网上搜索。

微机原理必备程序段Word格式.docx

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

12

?

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 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 考试认证 > 财会金融考试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1