汇编语言程序设计实例分析
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
MOV DS,AX
MOV AL,TAB MOV BX,OFFSET TAB MOV CL,9 LL: INC BX CMP AL,[BX] JAE TT XCHG AL,[BX] TT: DEC CL JNZ LL MOV MAX,AL MOV AH,4CH INT 21H CODE ENDS END START
例3:设计一个程序,统计内存W单元保 存的无符号字数据中有多少个二进制 “1”,结果送内存N单元保存
分析:要统计内存W单元保存的无符号字数 据中有多少个二进制“1”,可将该数据送至 寄存器AX中,通过移位指令将AX中的每一 位依次移入进位位CF中,若CF=1则计数器 CL的值加1。 这样就可以统计出址加1 ;两数比较 ;大于等于转 ;交换数据位置 ;计数器减1 ;非0转 ;保存最大数
例7:从键盘输入3-9之间的数字,用 “*”号组成三角形图案
例如:输入数字7,屏幕上显示出以下图案: ******* ****** ***** **** *** ** * 可采用双重循环程序,外循环控制行数,内循环 控制列数。
CODE SEGMENT ASSUME CS:CODE START:MOV AH,01H INT 21H CMP AL,33H JB START CMP AL,39H JA START SUB AL,30H MOV CL,AL MOV CH,0 MOV DL,0DH MOV AH,02H INT 21H MOV DL,0AH INT 21H
思考:在本例的基础上,若要在屏幕上 显示出以下图案,应该如何设计程序?
* ** *** **** ***** ****** ******* ********* 或者: * * *
*
* * ************
*
实验要求
验证课本上的相关程序 验证本次讲的例题 自行编程并进行调试运行 周三的2单元延续本次的实验 将两次实验内容及结果进行归纳总 结,上交实验报告
DATA BUFA SEGMENT DW 367BH,2845H,0A78H, 9DE3H,0F6BH,6532H COUNT EQU ($-BUFA)/2 BUFB DW COUNT DUP (?) DATA ENDS STACK SEGMENT STACK DB 200 DUP(?) STACK ENDS CODE SEGMENT ASSUME DS:DATA,SS:STACK, CS:CODE START: MOV AX,DATA MOV DS,AX
;键盘输入1个数字至AL ;与数字3比较 ;低于转 ;与数字9比较 ;高于转 ;ASCII码转换为数字 ;保存至AL中 ;CH清0 ;输出回车
;输出换行
AA:PUSH CX ;保存循环次数 BB:MOV DL,‘*’ ;输出“*” MOV AH,02H INT 21H LOOP BB ;内循环 MOV DL,0DH ;输出回车 INT 21H MOV DL,0AH ;输出换行 INT 21H POP CX LOOP AA ;外循环 EXIT:MOV AH,4CH INT 21H CODE ENDS END START
MOV SI,0 ;初始化 MOV DI,0 MOV CX,COUNT ;计数器初值 LOP: MOV AX,BUFA[SI] ;取数 MOV BUFB[DI],AX ;送数 INC SI ;字数据占用2个单元 INC SI ;地址加2 INC DI INC DI DEC CX ;计数器减1 JNZ LOP ;非0转 MOV AH,4CH INT 21H CODE ENDS END START
例6:将内存中任意存放的10个无符号 字节数据中的最大数找出,存入MAX单元
DATA SEGMENT TAB DB 5,8,10,43,54,12,100,4,67,90 MAX DB ? DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
;DOS调用,从键盘输入1个字符 ;保存在BL中 ;送‘-’号到DL ;显示字符‘-’ ;取回键盘输入的字符 ;与‘a’比较 ;低于转EXIT
CMP AL,‘z’ JA EXIT SUB AL,20H MOV DL,AL MOV AH,02H INT 21H MOV DL,0AH MOV AH,02H INT 21H MOV DL,0DH MOV AH,02H INT 21H JMP START EXIT:MOV AH,4CH INT 21H CODE ENDS END START
汇编语言程序设计实例分析
注意事项: 1.按照程序分段的原则,合理设定各段 内容 2.凡是用到内存单元的数据、变量及符 号地址等应该在数据段或堆栈段中加以 描述 3.程序的执行顺序由逻辑地址CS:IP确定
CS-当前指令所在代码段的段地址
IP-要执行的下一条指令的偏移地址
例1:将内存缓冲区中以BUFA开始的一 组字数据传送到BUFB开始的内存区
AA:AND AX,AX JZ CC SHL AX,1 JNC BB INC CL BB:JMP AA CC:MOV N,CL MOV AH,4CH INT 21H CODE ENDS END START
;判AX=0? ;为0转移到CC ;逻辑左移1位 ;无进位转BB ;有“1”则计数 ;无条件转AA ;结果送N单元
例2:已知在内存中从BLOCK单元起存放 有20个带符号字节数据,统计其中负数 的个数并放入COUNT单元
DATA SEGMENT BLOCK DB -7,1,12,-90,-70, 34,-1,56 DB 45,-12, -3,-4,23,0,12 DB 11,-9,-8,67,-56 CN EQU $-BLOCK COUNT DB ? DATA ENDS CODE SEGMENT ASSUME DS:DATA,CS:CODE START:MOV AX,DATA MOV DS,AX
例4:设计一个程序,连续将键盘输入的小写 字母转为大写字母,字母之间用“-”号间隔
CODE SEGMENT ASSUME CS:CODE START:MOV AH,01H INT 21H MOV BL,AL MOV DL,‘-’ MOV AH,02H INT 21H MOV AL,BL CMP AL,‘a’ JB EXIT
DATA SEGMENT W DW 0F0FH ;定义字数据 N DB ? ;设置计数单元 DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA START: MOV AX,DATA MOV DS,AX MOV CL,0 ;计数器清零 MOV AX,W ;取数到AX
MOV DL,0 ;初始化DL LEA SI,BLOCK ;取有效地址 MOV CX,CN ;取计数器初值 LP: MOV AL,[SI] ;取数 TEST AL,80H ;测试符号位 JZ NEXT ;非0转 INC DL ;为负数时计数 NEXT:INC SI ;地址加1 LOOP LP ;循环 MOV COUNT,DL ;保存负数个数 MOV AH,4CH INT 21H CODE ENDS END START
;与 ‘z’比较 ;高于转移到EXIT ;取大写字母 ;输出
;调用换行 ;调用回车
;无条件转
例5:设计子程序,实现用DOS功能调用 完成屏幕光标回车和换行的处理功能
本题在子程序中实现DOS的功能调用,调 用的基本步骤和方法是: 在指定寄存器中设置入口参数;
在AH寄存器中设置系统功能调用号;
采用中断调用指令INT 21H来实现功能调 用。
子程序如下: STAR PROC FAR ;定义过程名为STAR PUSH AX ;保护现场 PUSH DX MOV DL,0DH ;入口参数,回车CR的ASCII码 MOV AH,02H ;设置系统功能号 INT 21H ;DOS调用,显示字符 MOV DL,0AH;入口参数,换行LR的ASCII码 MOV AH,02H ;设置系统功能号 INT 21H ;DOS调用,显示字符 POP DX ;恢复现场 POP AX RET ;子程序返回 STAR ENDP ;过程结束
MOV AL,TAB MOV BX,OFFSET TAB MOV CL,9 LL: INC BX CMP AL,[BX] JAE TT XCHG AL,[BX] TT: DEC CL JNZ LL MOV MAX,AL MOV AH,4CH INT 21H CODE ENDS END START
例3:设计一个程序,统计内存W单元保 存的无符号字数据中有多少个二进制 “1”,结果送内存N单元保存
分析:要统计内存W单元保存的无符号字数 据中有多少个二进制“1”,可将该数据送至 寄存器AX中,通过移位指令将AX中的每一 位依次移入进位位CF中,若CF=1则计数器 CL的值加1。 这样就可以统计出址加1 ;两数比较 ;大于等于转 ;交换数据位置 ;计数器减1 ;非0转 ;保存最大数
例7:从键盘输入3-9之间的数字,用 “*”号组成三角形图案
例如:输入数字7,屏幕上显示出以下图案: ******* ****** ***** **** *** ** * 可采用双重循环程序,外循环控制行数,内循环 控制列数。
CODE SEGMENT ASSUME CS:CODE START:MOV AH,01H INT 21H CMP AL,33H JB START CMP AL,39H JA START SUB AL,30H MOV CL,AL MOV CH,0 MOV DL,0DH MOV AH,02H INT 21H MOV DL,0AH INT 21H
思考:在本例的基础上,若要在屏幕上 显示出以下图案,应该如何设计程序?
* ** *** **** ***** ****** ******* ********* 或者: * * *
*
* * ************
*
实验要求
验证课本上的相关程序 验证本次讲的例题 自行编程并进行调试运行 周三的2单元延续本次的实验 将两次实验内容及结果进行归纳总 结,上交实验报告
DATA BUFA SEGMENT DW 367BH,2845H,0A78H, 9DE3H,0F6BH,6532H COUNT EQU ($-BUFA)/2 BUFB DW COUNT DUP (?) DATA ENDS STACK SEGMENT STACK DB 200 DUP(?) STACK ENDS CODE SEGMENT ASSUME DS:DATA,SS:STACK, CS:CODE START: MOV AX,DATA MOV DS,AX
;键盘输入1个数字至AL ;与数字3比较 ;低于转 ;与数字9比较 ;高于转 ;ASCII码转换为数字 ;保存至AL中 ;CH清0 ;输出回车
;输出换行
AA:PUSH CX ;保存循环次数 BB:MOV DL,‘*’ ;输出“*” MOV AH,02H INT 21H LOOP BB ;内循环 MOV DL,0DH ;输出回车 INT 21H MOV DL,0AH ;输出换行 INT 21H POP CX LOOP AA ;外循环 EXIT:MOV AH,4CH INT 21H CODE ENDS END START
MOV SI,0 ;初始化 MOV DI,0 MOV CX,COUNT ;计数器初值 LOP: MOV AX,BUFA[SI] ;取数 MOV BUFB[DI],AX ;送数 INC SI ;字数据占用2个单元 INC SI ;地址加2 INC DI INC DI DEC CX ;计数器减1 JNZ LOP ;非0转 MOV AH,4CH INT 21H CODE ENDS END START
例6:将内存中任意存放的10个无符号 字节数据中的最大数找出,存入MAX单元
DATA SEGMENT TAB DB 5,8,10,43,54,12,100,4,67,90 MAX DB ? DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
;DOS调用,从键盘输入1个字符 ;保存在BL中 ;送‘-’号到DL ;显示字符‘-’ ;取回键盘输入的字符 ;与‘a’比较 ;低于转EXIT
CMP AL,‘z’ JA EXIT SUB AL,20H MOV DL,AL MOV AH,02H INT 21H MOV DL,0AH MOV AH,02H INT 21H MOV DL,0DH MOV AH,02H INT 21H JMP START EXIT:MOV AH,4CH INT 21H CODE ENDS END START
汇编语言程序设计实例分析
注意事项: 1.按照程序分段的原则,合理设定各段 内容 2.凡是用到内存单元的数据、变量及符 号地址等应该在数据段或堆栈段中加以 描述 3.程序的执行顺序由逻辑地址CS:IP确定
CS-当前指令所在代码段的段地址
IP-要执行的下一条指令的偏移地址
例1:将内存缓冲区中以BUFA开始的一 组字数据传送到BUFB开始的内存区
AA:AND AX,AX JZ CC SHL AX,1 JNC BB INC CL BB:JMP AA CC:MOV N,CL MOV AH,4CH INT 21H CODE ENDS END START
;判AX=0? ;为0转移到CC ;逻辑左移1位 ;无进位转BB ;有“1”则计数 ;无条件转AA ;结果送N单元
例2:已知在内存中从BLOCK单元起存放 有20个带符号字节数据,统计其中负数 的个数并放入COUNT单元
DATA SEGMENT BLOCK DB -7,1,12,-90,-70, 34,-1,56 DB 45,-12, -3,-4,23,0,12 DB 11,-9,-8,67,-56 CN EQU $-BLOCK COUNT DB ? DATA ENDS CODE SEGMENT ASSUME DS:DATA,CS:CODE START:MOV AX,DATA MOV DS,AX
例4:设计一个程序,连续将键盘输入的小写 字母转为大写字母,字母之间用“-”号间隔
CODE SEGMENT ASSUME CS:CODE START:MOV AH,01H INT 21H MOV BL,AL MOV DL,‘-’ MOV AH,02H INT 21H MOV AL,BL CMP AL,‘a’ JB EXIT
DATA SEGMENT W DW 0F0FH ;定义字数据 N DB ? ;设置计数单元 DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA START: MOV AX,DATA MOV DS,AX MOV CL,0 ;计数器清零 MOV AX,W ;取数到AX
MOV DL,0 ;初始化DL LEA SI,BLOCK ;取有效地址 MOV CX,CN ;取计数器初值 LP: MOV AL,[SI] ;取数 TEST AL,80H ;测试符号位 JZ NEXT ;非0转 INC DL ;为负数时计数 NEXT:INC SI ;地址加1 LOOP LP ;循环 MOV COUNT,DL ;保存负数个数 MOV AH,4CH INT 21H CODE ENDS END START
;与 ‘z’比较 ;高于转移到EXIT ;取大写字母 ;输出
;调用换行 ;调用回车
;无条件转
例5:设计子程序,实现用DOS功能调用 完成屏幕光标回车和换行的处理功能
本题在子程序中实现DOS的功能调用,调 用的基本步骤和方法是: 在指定寄存器中设置入口参数;
在AH寄存器中设置系统功能调用号;
采用中断调用指令INT 21H来实现功能调 用。
子程序如下: STAR PROC FAR ;定义过程名为STAR PUSH AX ;保护现场 PUSH DX MOV DL,0DH ;入口参数,回车CR的ASCII码 MOV AH,02H ;设置系统功能号 INT 21H ;DOS调用,显示字符 MOV DL,0AH;入口参数,换行LR的ASCII码 MOV AH,02H ;设置系统功能号 INT 21H ;DOS调用,显示字符 POP DX ;恢复现场 POP AX RET ;子程序返回 STAR ENDP ;过程结束