微机程序设计代码例题

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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

相关文档
最新文档