微机程序设计代码例题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、简单程序设计
简单程序设计是没有分支,没有循环的直线运行程序,程序执行按照IP内容自动增加的顺序进行。
例1 利用查表法计算平方值。已知0 ~ 9的平方值连续存在以SQTAB开始的存储区域中,求SUR单元内容X的平方值,并放在DIS单元中。假定0≤X≤9且为整数。
分析:建立平方表,通过查表完成。
STACK SEGMENT
DB 100 DUP(?)
STACK ENDS
DATA SEGMENT
SUR DB ?
DIS DB ?
SQTAB DB 0,1,4,9,16,25,36,49,64,81 ; 0~9的平方表DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK,ES:DATA BEGIN:PUSH DS
MOV AX,0
PUSH AX ;保证返回DOS,
MOV AX,DATA
MOV DS,AX ;为DS送初值
LEA BX,SQTAB ;以下程序部分完成查表求平方值
MOV AH,0 ;亦可用查表指令完成(如下程序段)
MOV AL,SUR ;AL=X LEA BX, SQTAB
ADD BX,AX ;MOV AL, SUR
MOV AL,[BX] ;XLAT
MOV DIS,AL ;MOV DIS, AL
CODE ENDS
END BEGIN
例2 已知Z=(X+Y)-(W+Z),其中X,Y,Z,W均为用压缩BCD码表示的数,写出程序。
分析:这也是一种典型的直线程序,在这里要注意是BCD数相加,要进行十进制调整。具体程序如下:
MOV AL ,Z MOV BL ,W ADD AL ,BL
DAA
MOV BL ,AL ; BL=(W+Z ) MOV AL ,X MOV DL ,Y ADD AL ,DL ; AL=(X+Y )
DAA ;十进制调整
SUB
AL ,BL ; AL=(X+Y )-(Z+W )
DAS ;十进制调整
MOV Z ,AL ;结果送Z 例2 利用表实现分支
根据AL 中各位被置位情况,控制转移到8个子程序P1~P8之一中去。转移表的结构如表3-2所示。
分析:对于这种程序关键要找出每种情况的转移地址,从图中可见
表地址=表基地址+偏移量, 而偏移量可由AL 各位所在位置*2求得。 流程图见图3-3。 DATA SEGMENT
BASE DW SR0,SR1,SR2,SR3, SR4,SR5,SR6,SR7 DATA ENDS CODE
SEGMENT
ASSUME CS :CODE ,DS :DATA ,ES :DATA BEGIN : PUSH DS XOR
AX ,AX
PUSH AX
MOV AX ,DATA 图3-3 流程图 MOV DS ,AX
LEA
BX ,BASE ;表头送BX
表3-2 子程序R1—R8的入口地址表
P1 子程序R1的入口偏移地址 P2 子程序R2的入口偏移地址 P3 子程序R3的入口偏移地址 …… …… ……. ……
P7 子程序R7的入口偏移地址 P8
子程序R8的入口偏移地址
IN AL,PORT
GETBIT:RCR AL,1 ;右移一位
JC GETAD ;移出位是1?
INC BX
INC BX ;修改指针
JMP GETBI
GETAD:JMP WORD PTR[BX] ;实现散转
CODE ENDS
END BEGIN
根据跳转表构成方法不同,实现分支的方法也有所改变,下面有三个问题希望大家思考:
(1) 若跳转表地址由段值和偏移量四个字节构成,程序应如何实现?
(2) 若跳转表中的内容由JMP OPRD指令构成,表的结构应如何组织、程序如何实现?
(3) 上述程序若不用间接跳转指令,而改为直接跳转,程序如何变动?
例3将内存中某一区域的原数据块传送到另一区域中。
分析:这种程序若源数据块与目的数据块之间地址没有重叠,则可直接用传送或串操作实现;若地址重叠,则要先判断源地址+数据块长度是否小于目的地址,若是,则可按增量方式进行,否则要修改指针指向数据块底部,采用减量方式传送。程序如下:
DATA SEGMENT
STR DB 1000 DUP(?)
STR1 EQU STR+7
STR2 EQU STR+25
STRCOUNT EQU 50
DATA ENDS
STACK SEGMENT PARA STACK ‘STACK’
STAPN DB 100DUP(?)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK GOO PROC
PUSH DS
SUB AX,AX ;将AX清零
PUSH AX
MOV AX,DATA
MOV DS,AX
MOV ES,AX
MOV AX,STACK
MOV SS,AX
MOV CX,STRCOUNT
MOV SI,STR1
MOV DI,STR2
CLD ;将DF置0确定地址修改方向
PUSH SI ;将源首地址入栈
ADD SI,STRCOUNT-1 ;判断源地址+数据块长度是否小
CMP SI,DI ;于目的地址
POP SI ;将源首地址弹出堆栈,赋给SI
JL OK ;如果源地址+数据;块长度小于目的地址,
直接传送数据
STD ;如果大于目的地址,将DF置1改变地址修改方向
ADD SI,STRCOUNT-1 ;从最后一个存储单元传送数据,以免
ADD DI,STRCOUNT-1 ;把源数据中最后几个单元的数据覆盖OK:REP MOVSB
RET
GOO ENDP
CODE ENDS
END GOO
例4 设内存BUFF开始的单元中依次存放着30个8位无符号数,求它们的和并放在SUM单元中,试编写程序。
分析:这是一个求累加的程序。(设计思想同C语言)程序如下:
MOV SI,BUFF ;设地址指针
MOV CX,30 ;设计数初值
XOR AX,AX ;设累加器初值
AGAIN:ADD AL,[SI]
ADC AH,0
INC SI