《汇编语言程序设计与上机调试课件.ppt》由会员分享,可在线阅读,更多相关《汇编语言程序设计与上机调试课件.ppt(45页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、4.6 汇编语言程序设计与上机调试4.6.1 汇编语言程序设计实例 前面介绍了编写汇编语言程序所需要掌握的基本知识,如基本语句、格式,以及如何用伪指令定义变量。常数和定义程序段等,也根据内容需要给出了简单例题。下面要从问题入手,设计汇编语言程序,编写一个汇编语言程序的框架。由于汇编语言精练、简洁、快速、面向机器编程,特别适合要求执行速度快的场合,尤其是对输入输出设备的控制,其效率是一般高级语言无法比拟的。1 1算术运算例题算术运算例题【例4-4】在偏移首地址为ARRAY的内存储区有100个字型数据,要求将数组的每个元素加1。DATA SEGMENT ARRAY DW 100 DUP(?);定义
2、1 00个字型随机数DATA EDNSCODE SEGMENT ASSUME DS:DATA,CS:CODESTART:MOV AX,DATA MOV DS,AX LEA BX,ARRAY ;设数组首地址指针 MOV CX,LENGTH ARRAY ;数组数据长度AA1:INC WORD PTRBX,1 ;指定为字型数加1 ADD BX,2 ;移动地址指针 LOOP AA1 ;循环操作 MOV AX,4C00H INT 21HCODE ENDS END START【例4-5】有两个无符号字节型数组,设数组元素个数相等,编程将数组中的对应元素相加,结果存入另一内存区。DATA SEGMENT M
3、1 DB 20 DUP(?)M2 DB 20 DUP(?)M3 DW 20 DUP(0)DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX LEA SI,M1;设数组1的地址指针 LEA DI,M2;设数组2的地址指针 LEA BX,M3;设结果区的地址指针 MOV CX,20AA1:MOV AL,SI ADD AL,DI MOV BX,AL ADC BYTE PTRBX+1,0;存结果的进位 INC SI INC DI ADD BX,2 LOOP AA1 MOV AX,4C00H INT 21 HCO
4、DE ENDS END START2逻辑处理题 【例4.6】将寄存器AL中高、低4位交换。CODE SEGMENT ASSUME CS:CODESTART:MOV AL,0ABH MOV CL,4 ROL AL,CL ;移出位补充移空位4次 MOV AX,4C00H INT 21 HCODE ENDS END START3代码转换例题【例4.8】编程将以$结束的字符串中的小写字母改为大写字母。DATA SEGMENT STR DB heLLo,eveRyboDY!,$DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART:MOV AX,DATA MO
5、V DS,AX LEA BX,STR A1:MOV AL,BX CMP AL,$;是$符,则结束 JE DONE CMP AL,a JB NEXT ;低于,则为大写字母 CMP AL,z JA NEXT ;高于,则不是字母 SUB AL,20H ;将小写字母改为大写字母将小写字母改为大写字母 MOV BX,ALNEXT:INC BX JMP A1DONE:MOV AX,4C00H INT 21HCODE ENDS END START【例例4-9】十六进制十六进制(二进制二进制)数到十进制的转换数到十进制的转换SST SEGMENT PARA STACK STACK TOP DW 50 DUP(
6、?)SST ENDS ;设置堆栈段CODE SEGMENT ASSUME CS:CODE,SS:SST START:MOV AX,SST MOV SS,AX MOV AX,4B6CH MOV CX,0 ;统计除法次数 MOV BX,10A1:MOV DX,0 ;被除数扩展为32位 DIV BX PUSH DX ;将转换好的数存入堆栈 INC CX OR AX,AX ;转换直到商为0 JNZ A1 MOV AX,4C00H INT 21 HCODE ENDS END START【例4-13】将BLOCK内存区的带符号字节型数据按正数、负数分开,并分别存入BUFF1和BUFF2中。(P120)DA
7、TA SEGMENT BLOCK DB 60 DUP(?)BUFF1 DB 60 DUP(?)BUFF2 DB 60 DUP(?)DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX MOV ES,AX LEA SI,BLOCK;数据区 LEA DI,BUFF1;正数缓冲区 LEA BX,BUFF2;负数缓冲区 MOV CX,60 CLDLOP:LODSB TEST AL,80H JNZ FU ;负数 STOSB ;否则,存入正数区 JMP AGAINFU:XCHG BX,DI ;交换目的地址 STOSB
8、 XCHG BX,DI ;还原目的地址 AGAIN:LOOP LOP MOV AX,4C00H INT 21H CODE ENDS END START【例4-1 5】编程实现,将一个带符号字节型数据组中的数据按从大到小的顺序排列。DATA SEGMENT BUFF DB 13,-39,96,84,-75,58 COUNT EQU$-BUFFDATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX MOV CX,COUNT-1LOP1:MOV DX,CX;保存循环次数 MOV SI,0 ;采用变址寻址LOP2:
9、MOV AL,BUFFSI CMP AL,BUFFSI+1;前数与后数比较 JGE COT ;前一个数大(或相等)转 XCHG AL,BUFFSI+1;否则交换内存位置 MOV BUFFSI,ALCOT:INC SI LOOP LOP2;所有数据排列一次 MOV CX,DX;开始下一次排序 LOOP LOP1 MOV AX,4C00H INT 21HCODE ENDS END START冒泡法冒泡法序号 比比 较较 遍遍 数数12345 1 13 2 -39 3 96 4 84 5 -75139684-395896841358-3996845813-3996845813-3996845813-
10、39 6 58-75-75-75-75-754.6.2 DOS4.6.2 DOS功能调用功能调用n21H号中断是DOS提供给用户的用于调用系统功能的中断,它有近百个功能供用户选择使用,主要包括设备管理、目录管理和文件管理三个方面的功能。n汇编语言程序设计需要采用系统的各种功能程序n充分利用操作系统提供的资源是程序设计的一个重要方面,需要掌握。(1)从键盘输入单个字符DOS功能调用INT 21H功能号:AH01H出口参数:(AL)字符的ASCII码功能:获得按键的ASCII代码值n调用此功能时,若无键按下,则会一直等待,直到按键后才读取该键值(2)屏幕显示一个字符DOS功能调用INT 21H功能
11、号:AH02H入口参数DL字符的ASCII码n功能:在显示器当前光标位置显示给定的字符,光标右移一个字符位置。如按Ctrl-Break或Ctrl-C则退出例:显示问号例:显示问号;在当前显示器光标位置显示一个问号mov ah,02h;设置功能号:ah02hmov dl,?;提供入口参数:dl?int 21h;DOS功能调用:显示(3)从键盘输入一串字符DOS功能调用INT 21H功能号:AH0AH入口参数:DS:DX缓冲区首地址n执行该功能调用时,用户按键,最后用回车确认。n本调用可执行全部标准键盘编辑命令;用户按回车键结束输入,如按CtrlBreak或CtrlC则中止。例:输入字符串例:输入
12、字符串buffer db 81 ;定义缓冲区第,1个字节填入可能输入的最大字符数db 0 ;存放实际输入的字符数db 81 dup(0);存放输入的字符串.mov ax,seg buffer;伪指令seg取得buffer的段地址mov ds,ax ;设置数据段DSmov dx,offset buffermov ah,0ahint 21h(4)屏幕显示字符串DOS功能调用INT 21H功能号:AH09H入口参数:DS:DX欲显示字符串在主存中的首 地址功能:在显示器输出指定的字符串n字符串应以$(24H)结束n可以输出回车(0DH)和换行(0AH)字符产生回车和换行的作用例:显示字符串例:显示字
13、符串string db Hello,Everybody!,0dh,0ah,$;在数据段定义要显示的字符串.mov ah,09h;设置功能号:ah09hmov dx,offset string ;提供入口参数:dx字符串的偏移地址int 21h;DOS功能调用:显示【例4-19】用子程序调用形式,编写从键盘输入4位十六进制数的程序。子程序名:ZH。功 能:检查键盘输入错误,将输入值转换成十六进制数。输入参数:AL ,输出参数:AL使用寄存器:BX和CXCODE SEGMENT ASSUME CS:CODESTART:MOV CX,4;输入输入4次次 MOV DX,CX ;转换转换4次次 MOV
14、BX,0 ;用用BX保存输入数据保存输入数据RE1:MOV AH,1 ;从键盘输入从键盘输入 INT 21H CALL ZH ;通过子程序转换通过子程序转换 SHL BX,CL ;组合成十六进制数组合成十六进制数 ADD BL,AL DEC DX JNZ RE1 ;循环输入循环输入4个数个数 MOV AX,4C00H INT 21HZH PROC CMP AL,9 ;将将ASC码转换为十六进制数码转换为十六进制数 JBE A2 ;输入值输入值9(09),则减则减30H CMP AL,a ;输入值输入值EDIT A.ASMMASM A.ASM :Source .ASM:AObject A.OBJ
15、:Source Listing NUL.LST:Cross Reference NUL.CRF:A.ASM(11):Warning A4031 Operand Types Must Match 51574+408842 Bytes Symbol Space Free0 Warning Error0 Severe Error DEBUG H.EXE-T MOV AX,DATAAX=1269 BX=0000 CX=0028 DX=0000 SP=0000 SI=0000 DI=0000DS=1259 ES=1259 SS=1269 CS=126A IP=0003 NV UP DI PL NZ NA
16、 PO NC126A:0003 8ED8 MOV DS,AX-TAX=1269 BX=0000 CX=0028 DX=0000 SP=0000 SI=0000 DI=0000DS=1269 ES=1259 SS=1269 CS=126A IP=0005 NV UP DI PL NZ NA PO NC126A:0005 8A160000 MOV DL,0000 MOV DL,X DS:0000=01-TAX=1269 BX=0000 CX=0028 DX=0001 SP=0000 SI=0000 DI=0000DS=1269 ES=1259 SS=1269 CS=126A IP=0009 NV
17、UP DI PL NZ NA PO NC126A:0009 02160100 ADD DL,0001 ADD DL,BYTE PTR Y DS:0001=02-T综合举例1.1.从键盘输入一个带符号的十进制数,转换成二进制数从键盘输入一个带符号的十进制数,转换成二进制数n子程序从键盘输入一个有符号十进制数;子程序还包含将ASCII码转换为二进制数的过程n输入时,负数用“”引导,正数直接输入或用“”引导n子程序用寄存器传递出口参数,主程序调用该子程序输入10个数据Data segmentcount=10array dw count dup(0);预留数据存储空间预留数据存储空间Data ends
18、Code segment assume ds:data,cs:codeStart:mov ax,data mov ds,ax mov cx,count mov bx,offset arrayagain:call read;调用子程序输入一个数据调用子程序输入一个数据 mov bx,ax;将出口参数存放缓冲区将出口参数存放缓冲区 inc bx inc bx call dpcrlf ;调用子程序,光标回车换行以便输入下一个数据调用子程序,光标回车换行以便输入下一个数据 loop again mov ah,4ch int 21h2.2.把有符号二进制数转换成十进制数在屏幕上显示把有符号二进制数转换成
19、十进制数在屏幕上显示n子程序在屏幕上显示一个有符号10进制数;子程序还包含将二进制数转换为ASCII码的过程n显示时,负数用“”引导,正数直接输出、没有前导字符n子程序的入口参数用共享变量传递,主程序调用该子程序显示10个数据万位万位10000商0000余数1000商 000余数 100商 00余数 10商 0余数千位千位百位百位十位十位个位个位主程序BINASC子程序子程序把二进制数转换成十进制数,在屏幕上显示DPCRLF子程序子程序回车换行CHANG子程序子程序转换一位十进制数主程序CX数据个数BX数据区首址X取一个数据调用BINASC调用DPCRLF处理完否?修改数据地址子程序BINAS
20、C保存寄存器CXX判定数据输出0置“”求补“”“”0显示结果返回结束NY二进制转换成十进制Data segment count=10 arraydw 123,-1234,0,1,-1,32767dw-32768,5678,-5678,9000 Xdw?;共享变量共享变量 Buffer db 10 dup(?)Data endsCode segment assume ds:data,cs:code mov ax,data mov ds,ax mov cx,count mov bx,offset array again:mov ax,bx inc bx inc bx mov x,ax ;将入口参数
21、存入共享变量 call BINASC ;调用子程序显示一个数据 call DPCRLF loop again mov ah,4ch int 21h123 1012102332012 101102 10 01 10堆栈123把有符号二进制数转换成十进制数的另一种方法把有符号二进制数转换成十进制数的另一种方法Data segment count=10 arraydw 123,-1234,0,1,-1,32767dw-32768,5678,-5678,9000 xdw?;共享变量共享变量Data endsCode segmentassume cs:code,ds:datamov cx,countmov bx,offset arrayagain:mov ax,bxmov x,ax;将入口参数存入共享变量将入口参数存入共享变量call binasc;调用子程序显示一个数据调用子程序显示一个数据inc bxinc bxcall dpcrlf;便于显示下一个数据便于显示下一个数据loop againmov ah,4ch int 21h
限制150内