《如何发挥主机内存各类寄存器(位)处理器的功能汇编语言程序设计课件》由会员分享,可在线阅读,更多相关《如何发挥主机内存各类寄存器(位)处理器的功能汇编语言程序设计课件(82页珍藏版)》请在金锄头文库上搜索。
1、10.1 概述w10.1.1 汇编语言程序设计的一般步骤w10.1.2 流程图返回本章首页返回本章首页10.1.1 汇编语言程序设计的一般步骤w汇编语言程序设计一般有以下几个步骤:w1分析问题,确定算法w2绘制流程图w3根据流程图编制程序w10调试程序返回本节返回本节10.1.2 流程图w1流程图的概念w流程图是由特定的几何图形、指向线、文字说明来表示数据处理的步骤,形象描述逻辑控制结构以及数据流程的示意图。流程图具有简洁、明了、直观的特点。2流程图符号表示流程图符号表示(1)起止框:表示程序)起止框:表示程序的开始和结束。的开始和结束。开始开始结束结束w(2)判断框 条件件(3)处理框)处理
2、框 YNw(10)指向线 10.2 顺序程序设计w下面举例说明顺序程序的设计。w【例10.1】试编写一程序计算以下表达式的值。w=(v-(*+-5100)/xw式中x、v均为有符号字数据。w设、的值存放在字变量、V中,结果存放在双字变量之中,程序的流程图如图10.1所示。图图1 10 0. .1 1 顺顺序序运运算算程程序序流流程程图图DXw源程序如下:wDATASEGMENTwXDW200wYDW100wZDW3000wVDW10000wWDW2 DUP(?)wDATAENDSwSTACKSEGMENT STACKw DB 200 DUP(0)wSTACKENDSwCODESEGMENTwA
3、SSUME DS: DATA, CS: CODE, SS:STACKwSTART:MOVAX,DATAwMOV DS,AX;DATAAXwMOV AX,X wIMUL Y;(X)*(Y)DX:AXwMOV CX,AXwMOV BX,DX;(DX:AX)(BX:CX)wMOV AX,ZwCWD;(Z)符号扩展wADDCX,AXwADCBX, DX; ( BX: CX) +( DX:AX)(BX:CX)wSUBCX,5100wSBBBX,0 ;(BX:CX)-5100(BX:CX)wMOVAX,V wCWD;(V)符号扩展wSUB AX,CXwSBB DX,BX;(DX:AX)-(BX:CX)(D
4、X:AX)wIDIV X;(DX:AX)/XwMOV W,AX;商WwMOV W+2,DX ;余数DXW+2wMOV AH,10CHwINT21HwCODEENDS;退出DOS 状态wEND START【例10.2 BX、AL与查表指令】w【例10.2】已知某班学生的英语成绩按学号(从1开始)从小到大的顺序排列在TAB表中,要查的学生的学号放在变量NO中,查表结果放在变量ENGLISH中。编写程序如下:wSTACKSEGMENT STACKwDB 200 DUP(0)wSTACKENDSwDATASEGMENTwTABDB 80,85,86,71,79,96w DB 83,56,32,66,7
5、8。810wNO DB 10wENGLIST DB ?wDATAENDSwCODESEGMENTw ASSUME DS:DATA,SS:STACK,CS:CODEwBEGIN:MOVAX,DATAwMOV DS ,AXwLEA BX,TAB wMOV AL,NOwDEC ALwXLAT TABwMOV ENGLISH,ALwMOV AH,10CHwINT 21HwCODEENDSwENDBEGIN10.3 分支程序设计(标志寄存器与条件转移指令)返回本章首页返回本章首页测试某一次运算的结果ZF=1 JZ/JESF=1 JSOF=1 JOPF=1 JPCF=1 JC(JB,JNAE)比较两个无符
6、号数(ASCII码)JB=JNAE=JC(借位位)JL=JNGEJNLE=JG测试CX的值,等于0则转移JCXZ10.3 分支程序设计(标志寄存器与条件转移指令)w10.3.1 用条件转移指令实现程序分支w10.3.2 用跳转表实现多路分支返回本章首页返回本章首页10.3.1 用条件转移指令实现程序分支w【例10.3】编写计算下面函数值的程序:w 1 X0wY= 0 X=0w -1 Xw设输入数据为X、输出数据Y,且皆为字节变量。程序流程图如图10.2所示。w程序如下:图图10.2 分支运算分支运算程序流程图程序流程图wDATASEGMENTwX DB -10wY DB ?wDATAENDSw
7、STACKSEGMENT STACKw DB 200 DUP(0)wSTACKENDSwCODESEGMENTwASSUME DS:DATA,SS:STACK,CS:CODEwSTART: MOV AX,DATAw MOVDS,AXw CMPX,0;与0进行比较w JGEA1;X0转A1w MOVY,-1;X 0时,-1Yw JMPEXITwA1: JG A2;X0转A2w MOVY,0;X=0时,0Yw JMPEXITwA2: MOVY,1;X0,1Y wEXIT: MOVAH,10CHw INT 21H wCODE ENDSw ENDSTART图图10.2 分支运算分支运算程序流程图程序流
8、程图XwDATASEGMENTwX DB -10wY DB ?wDATAENDSwSTACKSEGMENT STACKw DB 200 DUP(0)wSTACKENDSwCODESEGMENTwASSUME DS:DATA,SS:STACK,CS:CODEwSTART: MOV AX,DATAw MOVDS,AXw CMPX,0w JLEA1w MOVY,1w JMPEXITwA1: JLA2w MOVY,0w JMPEXITwA2: MOVY,-1 wEXIT: MOVAH,10CHw INT21H wCODE ENDSw ENDSTART【例10.10】 w【例10.10】试编一程序,求三
9、个带符号字数据中的最大值,并将最大值存入MAX字单元中。w设三个带符号数分别在三个字变量X、Y、Z中存储。程序流程图如图10.3所示 图图10.3例例10.10程序流程图程序流程图 w程序如下:wSTACSEGMENT STACKw DB 200 DUP(0)wSTACKENDSwDATASEGMENTwX DW 00ABHwY DW 5wZ DW 200wMAXDW ?wDATAENDSwCODESEGMENTw ASSUME DS:DATA,SS:STACK,CS:CODE wSTART: MOVAX,DATAw MOVDS,AXw MOVAX,Xw CMPAX,Y ;XY?w JGL1w
10、 MOVAX,Y ;YZ?w CMPAX,Zw JGEXITwL2: MOVAX,Zw JMPEXITw wL1:CMP AX,Z;XZ?w JLE L2wEXIT:MOV MAX,AXw MOVAH,10CHw INT 21HwCODEENDSw END START返回本节返回本节10.3.2 用跳转表实现多路分支(教材177页)w【例10.5】设某程序有8路分支,试根据给定的N值(18),将程序的执行转移到其中的一路分支。w程序流程如图10.10所示。 w程序如下:wDATASEGMENTwTABDW P1,P2,P3,P10,P5,P6,P7,P8wN DB 5wDATAENDSwSTA
11、CKSEGMENTw DB 200 DUP(0)wSTACKENDSwCODESEGMENTw ASSUME DS:DATA,SS:STACK,CS:CODE wSTART:MOV AX,DATAwMOV DS,AXwwMOV AL,NwDECALwADDAL,AL ;SHL ALwMOV BL,ALwMOV BH,0wJMPTABBX ;MOV AX,OFFSET TABADD BX,AXMOV AX,BXJMP AXwP1:wwJMPEXITwP2:wwJMPEXITwP2:wwJMPEXITwP3: ww JMPEXITwwP8:wwEXIT:MOV AH,10CHw INT 21HwC
12、ODEENDSw END STARTw上述程序中的无条件转移指令的转移地址采用的是变址寻址。同理,转移地址也可以用寄存器间接寻址或基址加变址寻址,读者可自行考虑。返回本节返回本节10.10 循环程序设计w10.10.1 循环程序的结构w10.10.2 单重循环程序设计w10.10.3 多重循环程序设计返回本章首页返回本章首页10.10.1 循环程序的结构w1初始化部分w2循环体部分w3循环控制部分循环程序的常见结构形式如图10.5(a)、(b)所示。返回本节返回本节循环体循环体10.10.2 单重循环程序设计w1计数控制w2条件控制1计数控制w【例10.7】已知有几个元素存放在以BUF为首址的
13、字节存贮区中,试统计其中正元素的个数。w显然,每个元素为一个8位有符号二进制数,统计其中正元素的个数可用循环程序实现。其程序流程图如图10.6所示。图图10.6 程程序序流流程程图图 =0=0Bxtitle accountdata segment number db 10,-23,-30,50,9,-105,32,310,20,86 s db 0data endscode segment assume cs:code,ds:data start: mov ax,data mov ds,ax mov bx,offset number mov cx,10 mov al,s 本题为统计本题为统计10
14、个数值中正数的个数个数值中正数的个数do2: mov dl,0 cmp bx,dl jle do1 inc al do1: dec cx cmp cx,0 jle exit inc bx jmp do2 exit: mov s,al mov ah,10ch int 21h code ends end start 本题为统计本题为统计10个数值中正数的个数个数值中正数的个数data segment message db overflow! a db 100 b db 100 c db ?data endscode segment assume cs:code,ds:datastart:mov a
15、x,data mov ds,ax mov al,a mov bl,b add al,bl jo chuli jmp end1 chuli:call yichu end1:mov ah,10ch int 21h yichu proc mov cx,11 mov si,offset message back:mov dl,si mov ah,2 int 21h dec cx inc si cmp cx,0 ja back ret yichu endp code ends end start 关于循环结构中的串操作指令实施步骤关于循环结构中的串操作指令实施步骤w1、如果串操作要涉及两个串,则一个串应
16、在DS中,叫做源串,另一个应在ES中,叫做目标串。定义一个同时包含这两个串的数据段,然后把段基址同时传送到DS和ES中,用DS:SI(偏移量1)表示源串,用DS:DI(偏移量2)表示目的串。w2、在串传送、比较等操作之前,因为在串的传送和比较过程时,系统是逐个字符进行比较的,所以传送和比较操作需要重复进行多次。因此需要在执行之前用CX保存重复执行的次数。w3、用CLD命令置DF=0,使SI,DI自动增量进行;用STD命令置DF=1,使SI,DI自动减量进行w10、增量可能是1也可能是2,这取决于串处理指令是字节型还是字类型。将内存中10000H单元开始存放的“classmates!”的字符串传
17、送到20000H单元开始的区域wtitle accountwdata segmentw org 1000hw db classmates!w org 2000hw db 11 dup(?)w data endsw code segmentw assume cs:code,ds:data,es:dataw 将内存中10000H单元开始存放的“classmates!”的字符串传送到20000H单元开始的区域wstart: mov ax,dataw mov ds,axw mov si,1000hw mov ax,dataw mov es,axw mov di,2000hw mov cx,11w cl
18、dw rep movsbw mov ah,10chw int 21hwcode endsw end start比较“classmate”和”classnate”是否相同wtitle accountwdata segmentw org 1000hw db classmatew org 2000hw db classnatewdata endswcode segmentw assume cs:code,ds:data,es:dataw start: mov ax,dataw mov ds,ax w mov si,1000hw mov ax,dataw mov es,ax 比较“classmate”
19、和”classnate”是否相同w mov di,2000hw mov cx,11w cldw repe cmpsbw cmp cx,0w jnz decision1w mov bx,0 ;equationw jmp exitwdecision1: mov bx,1 ;not equationwexit: mov ah,10chw int 21hw code endsw end start【例10.8】 w【例10.8】试编写一程序,要求比较两个字符串STR1和STR所含字符是否相同,若相同则显示MATCH!,若不相同则显示NO MATCH!。(程序略)w其流程图如图10.7所示。 图图10.
20、7 程程序序流流程程图图w【例10.9】试编一个程序将字单元BUF中所含1的个数存入COUNT单元中。要测出BUF字单元所含1的个数,首先将BUF中的数送给寄存器AX,然后将AX寄存器逻辑左移一次,如果CF=1,则表明AX中的最高位为1,则计数器CL计数1次,如果CF=0,表明AX最高位为0,这样依次将最高位移入CF中去测试。移位之后,判断AX的值是否为0,如果为0则结束循环,不为0,则继续循环。w其流程图如图10.8所示。2条件控制 w程序如下:wSTACKSEGMENT STACKw DB 200 DUP(0)wSTACKEDNSwDATASEGMENTwBUFDW 00111100101
21、01011BwCOUNTDB ?wDATAENDSwCODESEGMENTw ASSUME DS:DATA,CS:CODE,SS:STACK wSTART:MOVAX,DATAwMOVDS,AXwMOVAX,BUFwMOVCL,0 ;计数器为0wCOPA:ANDAX,AXwJEEXIT;(AX)=0,结束循环wSHLAX,1 ;AX 左移一位wJNCLOPAwINCCL;产生进位,(CL)+1CLwJMPLOPAwEXIT: MOVCOUNT,CLwMOVAH,10CHwINT21HwCODE ENDSwENDSTART返回本节返回本节10.10.3 多重循环程序设计w【例10.10】在以BU
22、F为首址的字存储区中存放有N个有符号数,现需将它们按大到小的顺序排列在BUF存储区中,试编写其程序。w我们采用冒泡排序算法从第一个数开始依次对相邻两个数进行比较,如次序对,则不交换两数位置;如次序不对则使这两个数交换位置。可以看出,第一遍需比较(N-1)次,此时,最小的数已经放到了最后;第二遍比较只需考虑剩下的(N-1)个数,即只需比较(N-2)次;第三遍只需比较(N-3)次,整个排序过程最多需(N-1)遍。如下面的10个数即是采用冒泡排序比较的例子。w数 108169032w第一遍 101690328w第二遍 169032108w第三遍 903216108w程序流程图如图10.9所示。w程序
23、如下:wDATASEGMENTwBUFDW 3,-10,6,7,9,2,0,-8,-9,-10,20wN=(-BUF)/2wDATAENDSwSTACK SEGNMENT STACKwDB 200 DUP(0)wSTACK ENDSwCODE SEGMENTwASSUME CS: CODE, DS: DATA, SS:STACKwSTART:MOVAX,DATAwMOVDS,AXwMOVCX,NwDECCXwLOOP1:MOVDX,CXwMOVBX,0wLOOP2:MOVAX,BUFBXwCMPAX,BUFBX+2wJGELwXCHG AX,BUFBX+2wMOVBUFBX,AXwL:ADDB
24、X,2wDECCXwJNELOOP2wMOV CX,DXwLOOP LOOP1wMOV AH,10CHwINT21HwCODEENDSwENDSTARTw程序运行后,BUF区中的内容如下:w20,9,7,6,3,2,0,-10,-8,-9,-10w若要对N个无符号数按由大到小的顺序排列,只需将指令“JGE L”改为“JAE L”即可。 返回本节返回本节10.5 子程序设计w10.5.1 子程序的概念w10.5.2 子程序的定义w10.5.3 子程序设计方法w10.5.10 子程序应用举例返回本章首页返回本章首页10.5.1 子程序的概念w在程序设计中,我们会发现一些多次无规律重复的程序段或语句
25、序列。解决此类问题一个行之有效的方法就是将它们设计成可供反复调用的独立的子程序结构,以便在需要时调用。在汇编语言中,子程序又称过程。w调用子程序的程序称为主调程序或主程序。 返回本节返回本节10.5.2 子程序的定义w子程序的定义是由过程定义伪指令PROC和ENDP来完成的。其格式如下:w过程名 PROC NEAR/FARw w过程名 ENDPw其中PROC表示过程定义开始,ENDP表示过程定义结束。过程名是过程入口地址的符号表示。w一般过程名同标号一样,具有三种属性,即段属性、偏移地址属性以及类型属性。 返回本节返回本节10.5.3 子程序设计方法w1信息的保护与恢复w2主程序与子程序参数传
26、递方式1信息的保护与恢复w例如:若子程序PROG中改变了寄存器AX,BX,CX,DX的值,则可采用如下方法保护和恢复现场。wPROGPROCwPUSHAXwPUSHBX wPUSHCX;保护现场wPUSHDXw w w POPDXwPOPCXwPOPBX;恢复现场wPOPAXwRET ;返回断点处wPROCENDP2主程序与子程序参数传递方式w(1)寄存器法w(2)约定单元法w(3)堆栈法返回本节返回本节10.5.10 子程序应用举例w【例10.12】将一个给定的二进制数按位转换成相应的ASCII码字符串,送到指定的存储单元并显示。如二进制数10010011转换成字符串为10010011。要求
27、将转换过程写成子程序,且子程序应具有较好的通用性,而必须能实现对8倍和16倍二进制数的转换。w入口参数:DX存放待转换的二进制数wCX存放待转换数的位数(8位或16位)wDI存放ASCII码首地址w出口参数:转换后的字符串存放在以DI作指针的字节存贮区中w程序如下:wDATASEGMENTwNUM8DB93HwNUM16DW0ABCDHwASCBUFDB20DUP(0)wDATAENDSwCODE SEGMENTwASSUME DS:DATA,CS:CODE, SS:STACKwSTART:MOVAX,DATAwMOVDS,AXwMOVDX,0wMOVDL,NUM8;转换二进制数送DXwMOV
28、CX,8 ;置位数8wLEADI,ASCBUF;字符串首址DIwCALLBTASC ;调用子程序BTASCwMOVDI,BYTE PTR 0DHwMOVDI+1,BYTE PTR 0AHw MOVDI+2,BYTE PTR $wLEADX,ASCBUFwMOVAH,9wINT21HwMOVDX,NUM16wMOVCX,16;置位数16wLEADI,ASCBUFwCALLBTASCw MOVDL,BYTE PTR 0DHwMOVDL+1,BYTE PTR 0AHwMOVDL+2,BYTE PTR ; 显示转换后的字符串wLEADX, ASCBUF wMOVAH,9 wINT21HwBTASC P
29、ROCwPUSHAX;保存AXwMOVAL,0wCMPCX,8 ;比较8位数wJNEL1;直接转换16位数wMOVDH,DL;8位数转换送DHwL1:ROLDX,,1 ;DX最高位移入CFwRCLAL,1;CF移入AL最低位wADDAL,30HwMOVDI,ALwINCDIwLOOPL1wPOP AXwRETwBTASCENDPwCODEENDSwEND START返回本节返回本节data segment message db overflow!$ a db 100 b db 100 c db ?data endscode segment assume cs:code,ds:datastart
30、:mov ax,data mov ds,ax mov al,a mov bl,b add al,bl jo chuli jmp end1 chuli:call yichu end1:mov ah,10ch int 21h yichu proc mov dl,offset message mov ah,9 int 21h ret yichu endp code ends end start10.7 高级汇编语言技术w10.7.1 宏指令w10.7.2 宏指令的使用过程返回本章首页返回本章首页10.7.1 宏指令w在汇编语言程序设计过程中,可以将具有一定功能,需多次重复使用,且比较短的程序段定义成
31、一条宏指令。w使用宏指令语句可以减少程序书写错误,缩短源程序长度,使源程序编写像高级语言一样清晰、简洁。特别是使用宏库后,可以提高编程效率。返回本节返回本节10.7.2 宏指令的使用过程w1宏定义w2宏调用w3宏扩展1宏定义w(1)带参宏定义w宏指令名 MACRO 形参1,形参2,w宏体 wENDMw(2)无参宏定义w宏指令 MACROw宏体wENDM2宏调用w格式:w宏指令名 实参1,实参2,w例如:对上面的宏定义的三种调用形式为:wwPRINTBUF1wwPRINTBUF2wwPRINTBUF3w3宏扩展ww+ LEADX,BUF1w+ MOVAH,9w+ INT21Hww+ LEADX,BUF2w+ MOVAH,9w+ INT21H + LEADX,BUF3+ MOVAH,9+ INT21H 例如:上面三次宏调用,其展开的形式为:例如:上面三次宏调用,其展开的形式为: 返回本节返回本节