前言:公号 「编程有料」后台回复 “大礼包” 即可获取近1000本助力你编程之路的电子书
汇编语言程序设计(重难点)
程序设计的一般步骤为:
-
- 分析问题
-
- 确定算法
-
- 分配存贮区
-
- 绘制流程图
-
- 根据流程图编程
-
- 调试程序。
下面将通过一些汇编相关题目来理解学习:顺序结构设计,分支结构设计,循环结构设计,子程序设计。
例1:试编制一程序,求出下列公式中的Z 值,并存放在RESULT 单元中。其中,X、Y 的值分别存放在VARX、VARY单元中。Z={(X+Y) * 8 - X}/2
DATA SEGMENT
VARX DW 6
VARY DW 7
RESULT DW ?
DATA ENDS
COSEG SEGMENT
ASSUME CS:COSEG,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV DX,VARX
ADD DX,VARY
MOV CL,3
SAL DX,CL ;算术左移3位相当于乘以8
SUB DX,VARX
SAR DX,1
MOV RESULT,DX
MOV AH,4CH
INT 21H
COSEG ENDS
END START
例2:内存中自TABLESQ 开始的10个单元连续存放着自然数0到9的平方值,任给一数x(0<=x<=9)在XX单元中,查表求出X的平方值,将结果存入YY单元中。
DATA SEGMENT
TABLEWSQ DB 0,1,4,9,16,25,36,49,64,81
XX DB ?
YY DB ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOVE AX,DATA
MOV DA,AX
MOV AH,1
INT 21H
AND AL,OFH
MOV XX,AL
MOV BX,OFFSET TABLESQ
XLAT
MOV YY,AL
MOV AH,4CH
INT 21H
CODE ENDS
END START
例3:从键盘上输入字符串并显示在显示器上。
//思路:DOS 的9号功能调用和10号功能调用
DATA SEGMENT
KEYBUF DB 12,?,11 DUP('$')
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
LEA DX,KEYBUF
MOV AH,OAH
INT 21H
LEA DX,KEYBUF+2
MOV AH,O9H
INT 21H
MOV AH,4CH
INT 21H
CODE ENDS
END START
例4:已知有N 个数据存放在以BUF 为首地址的字节存储区中,编程统计其中负数的个数。
//思路:循环次数已知,采用计数型循环,在程序中用到三个寄存器:
AX:用来累加BUF 中负数的个数,初值为0
BX:指示BUF的地址,初值为BUF的首地址
cX:控制循环的次数,初值为N
循环条件:当CX≠0时,执行循环体
DATA SEGMENT
BUF DB -2,5,-3,6,10,0,-20,-9
N=$-BUF
RESULT Dw ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
MOV AX,0
LEA BX,BUF
MOV CX,N
CYCLE:
CMP BYTE PTR [BX],0
JGE NEXT
INC AX
NEXT:
INC BX
LOOP CYCLE
MOV RESULT,AX
MOV AH,4CH
INT 21H
CODE ENDS
END START
例4:编写含有两个代码段的程序,其中一个代码段MY 包含在显示器上输出“HELLO” 的子程序SUB1,在另一个代码段CODE 里调用SUB1 在显示器上输出“HELLO”。
DATA SEGMENT
BUF DB 'HELLO$'
DATA ENDS
MY SEGMENT
ASSUME CS:MY
SUB1 PROC FAR
MOV DX,OFFSET BUF
MOV AH,9
INT 21H
RET
SUB1 ENDP
MY ENDS
//CODE代码段
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
CALL SUB1
MOV AH,4CH
INT 21H
CODE ENDS
END START