150 likes | 302 Views
5.5 汇编语言程序设计的基本方法. 通常 , 编制一个汇编语言源程序应按如下步骤进行 : ⑴ 明确任务 , 确定算法。 ⑵ 绘制流程图。 ⑶ 根据流程图编写汇编语言程序。 ⑷ 上机调试程序。 程序的基本结构有四种:顺序结构、分支结构、循环结构和子程序结构。. 5.5.1 顺序程序设计. 开始. 顺序结构也称线性结构,其特点是其中的语句或结构被连续执行。 顺序程序是最简单的,也是最基本的一种程序结构。这种结构的程序从开始到结尾一直是顺序执行的,中途没有任何分支。从这种结构的流程图来看,除了有一个起始框,一个终止框外,就是若干执行框,没有判断框。. S1.
E N D
5.5 汇编语言程序设计的基本方法 通常,编制一个汇编语言源程序应按如下步骤进行: ⑴ 明确任务,确定算法。 ⑵ 绘制流程图。 ⑶ 根据流程图编写汇编语言程序。 ⑷ 上机调试程序。 程序的基本结构有四种:顺序结构、分支结构、循环结构和子程序结构。
5.5.1 顺序程序设计 开始 顺序结构也称线性结构,其特点是其中的语句或结构被连续执行。 顺序程序是最简单的,也是最基本的一种程序结构。这种结构的程序从开始到结尾一直是顺序执行的,中途没有任何分支。从这种结构的流程图来看,除了有一个起始框,一个终止框外,就是若干执行框,没有判断框。 S1 S2 S3 结束
[例1]求两个数的平均值。这两个数分别存放在X单元和Y单元中,而平均值放在Z单元中。源程序编制如下:[例1]求两个数的平均值。这两个数分别存放在X单元和Y单元中,而平均值放在Z单元中。源程序编制如下: DATA SEGMENT X DB 8CH Y DB 64H Z DB ? DATA ENDS STACK SEGMENT stack st DW 20H DUP(0) stackbottom dw $-st STACK ENDS
CODE SEGMENT MAIN PROC FAR ASSUME CS:CODE ASSUME DS:DATA ASSUME SS:STACK START: PUSH DS MOV AX, 0 PUSH AX MOV AX, DATA MOV DS, AX MOV AX, STACK MOV SS, AX MOV SP, stackbottom
MOV AL, X ADD AL, Y MOV AH, 0 ADC AH, AH SHR AX, 1 MOV Z, AL RET MAIN ENDP CODE ENDS END START Li508.asm
例5.9 在内存中自tab开始的16个单元连续存放着0至15的平方值(平方表),任给一个数x(0≤x≤15)在x单元中,如13,查表求x的平方值,并把结果放入y单元中。 DATA SEGMENT tab DB 0,1,4,9,16,25,36,49,64,81 DB 100,121,144,169,196,225 x DB 13 y DB ? DATA ENDS
CODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX LEA BX,tab MOV AH,0 MOV AL,x ADD BX,AX MOV AL,[BX] MOV y,AL MOV AH,4CH INT 21H CODE ENDS END START LEA BX,tab MOV AL,x XLAT Li509.asm
5.5.2 分支程序设计 分支程序结构也称条件结构,通常是在两种或两个以上的不同的操作中选择其中的一个,如下图所示: 分支是通过条件转移指令来实现的。分支结构有一个共同点:运行方向总是向前的。 Y Y 条件 条件 条件 … N N S S1 S2 Sn S1 S2
[例2] 现有一符号函数: 1 当X>0时 Y= 0 当X=0时 -1 当X<0时 假定X为-25,且存放在VARX单元中,函数值Y存放在VARY单元,试编写程序根据X的值确定函数Y的值。 根据题意画出流程图如下:
开始 AL←X 实现符号函数程序的流程图 AL≥0? Y N AL=0 Y Y←-1 N Y←1 Y←0 结束
编写程序如下: DSEG SEGMENT VARX DB -25 VARY DB ? DSEG ENDS CSEG SEGMENT ASSUME CS:CSEG,DS:DSEG START: MOV AX, DSEG MOV DS, AX MOV AL, VARX CMP AL, 0 JGE NEXT MOV AL, 0FFH ;MOV AL,-1 JMP EXIT
MOV DL, VARY MOV CL, 4 ROR DL, CL AND DL, 0FH CMP DL, 0AH JB NUM ADD DL, 7 NUM: ADD DL, 30H MOV AH, 2 INT 21H MOV DL, VARY AND DL, OFH CMP DL, 0AH JB NUB ADD DL, 7 NUB: ADD DL, 30H MOV AH, 2 INT 21H MOV DL, ‘H’ MOV AH, 2 INT 21H NEXT: JE ZERO MOV AL, 1 JMP EXIT ZERO: MOV AL, 0 EXIT: MOV VARY, AL MOV AH, 4CH INT 21H CODE ENDS END START Li510.asm
DATAJ SEGMENT DW ? n DW 15 number DW 83 arry DW 5,10,17,21,28,32,41,50,56,67,72 DW 88,95,125,150 DATAJ ENDS CODMA SEGMENT MAIN PROC FAR ASSUME CS:CODMA,DS:DATAJ,ES:DATAJ TART:PUSH DS SUB AX,AX PUSH AX PUSH ES MOV AX,DATAJ MOV DS,AX PUSH DS POP ES
MOV AX,number ;待查找的数放入AX MOV DX,n ;初始化DX MOV CX,n ;设置计数器CX MOV DI,OFFSET arry ;arry的有效地址放入DI CLD ;建立方向标志 REPNE SCASW ;用重复串扫描指令进行查找 JE DELETE DEC DX MOV SI,DX ADD SI,DX TT3: CMP AX,arry[SI] JL TT1 MOV arry[SI+2],AX ;功能是:若没有查到, JMP TT2 ;则将此数插入正确位置 TT1: MOV BX,arry[SI] MOV arry[SI+2],BX SUB SI,2 JMP TT3 TT2: ADD DX,2 ;修改数组长度 JMP FAN DELETE: JCXZ NEXT LOOPT: MOV BX,[DI] ;此程序段功能是:若查找到, MOV [DI-2],BX ;则从数组中删除该数 ADD DI,2 LOOP LOOPT NEXT: DEC DX ;修改数组长度 FAN: POP ES RET MAIN ENDP CODMA ENDS END START Li511.asm