《汇编语言层》PPT课件.ppt

上传人:牧羊曲112 文档编号:5541239 上传时间:2023-07-19 格式:PPT 页数:85 大小:443KB
返回 下载 相关 举报
《汇编语言层》PPT课件.ppt_第1页
第1页 / 共85页
《汇编语言层》PPT课件.ppt_第2页
第2页 / 共85页
《汇编语言层》PPT课件.ppt_第3页
第3页 / 共85页
《汇编语言层》PPT课件.ppt_第4页
第4页 / 共85页
《汇编语言层》PPT课件.ppt_第5页
第5页 / 共85页
点击查看更多>>
资源描述

《《汇编语言层》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《汇编语言层》PPT课件.ppt(85页珍藏版)》请在三一办公上搜索。

1、1,第5章 汇编语言层,内容回顾:,1.(宏)汇编语言的概念2.汇编语言语句格式3.80 x86宏汇编语言的常数、变量、标号、运算符和表达式,2,第1节 概述,1.汇编语言一种面向机器的低级程序设计语言符号化的机器语言,汇编指令与机器指令一一对应用助记符(Memoni)代替操作码用地址符号(Symbol)或标号(Label)代替地址码 2.宏汇编语言一种更高级的汇编语言包含一般汇编语言的功能,而且提供了记录、结构和字符串操作;具有宏处理、条件汇编及DOS功能调用等多种功能,3,(1)指令语句格式,(2)伪指令语句格式,第2节 汇编语言语句格式,4,第3节 80 x86宏汇编语言数据、表达式和运

2、算符,5.3.1 常数,纯数值数据、无属性、值不能改变,1.数值常数(B、O、Q、D、H),2.字符常数(“”ASCII码),5,5.3.2 变量 数据或存储单元的符号地址5.3.3 标号 指令的符号地址,转移类指令的目标地址5.3.4 表达式与运算符 1.运算符 2.表达式 由常数、变量、标号通过运算符连接而成,6,第4节 80 x86宏汇编语言伪指令,伪指令是汇编程序对源程序进行汇编时处理的操作,完成处理器选择、存储模式定义、数据定义、存储器分配、指示程序开始结束等功能。赋值伪指令(EQU/=)处理器选择伪指令段定义伪指令(SEGMENT/ENDS)段寻址伪指令(ASSUME)段组伪指令(

3、GROUP)定位伪指令(ORG)与对准伪指令(EVEN)过程定义伪指令(PROC/ENDP)包含伪指令(INCLUDE)标题伪指令(TITLE),7,2、等号=,格式:符号=表达式,功能:与EQU相同;,区别:可重新定义符号。,8,code segment code assume cs:code,ds:code,ss:code,es:codebegin:num1 EQU 99 num2=66 sum dw?main proc near mov ax,num1 add ax,num2 mov sum,axmain endpcode ends,例:,9,5.4.2 处理器选择伪指令,用于确定选择使

4、用哪种指令系统,缺省时为8086/8088指令系统和8087协处理器指令集。,.8086.286.286P,.486.486P,通常放在源程序的开头位置。,其中,“P”表示保护模式,.386.386P,.586.586P,10,5.4.3 段结构伪指令,1、段定义伪指令SEGMENT/ENDS,格式:,功能:指定逻辑段的名字和范围、段的起始边界、段与段之间的连接关系等。,(1)段名,必选,开始与结尾的段名一致,(2)定位类型,可选,指定装入时的起始边界要求,4种:PAGE(页)、PARA(节)、WORD(字)、BYTE(字节),11,(3)组合类型,可选,指定段与段之间的连接方式,6种:NON

5、E(隐含)、PUBLIC、COMMON、STACK、MEMORY、AT,(4)使用类型,可选,指定386以上CPU的段模式,2种:USE16 段基值和偏移地址都是16位 USE32 段基值16位,偏移地址32位,(5)类别名,可选,单引号扩起来,2、段寻址伪指令 ASSUME,格式:,ASSUME sr1:seg1,sr2:seg2,功能:建立段名与段寄存器之间的联系,12,DS_DATA SEGMENTVAR1 DB12HDS_DATA ENDSES_DATA SEGMENTVAR2 DB34HES_DATA ENDSCODE SEGMENTVAR3 DB 56HASSUME CS:CODE

6、,DS:DS_DATA,ES:ES_DATASTART:INC VAR1INC ES:VAR2INC CS:VAR3CODEENDSEND START,例:,13,3、段寄存器的装载,(1)DS 和 ES 的装载,用数据传送指令,例:,MOV AX,DATA_DS;设置DSMOV DS,AXMOV AX,DATA_ES;设置ESMOV ES,AX,(2)SS 的装载,自动装载:定义堆栈段时,组合类型置为STACK。,STACK1SEGMENT PARA STACKDW 20H DUP(0)STACK1ENDS,用执行指令的方法装载:与DS/ES的装载方法类似。,14,STACK1 SEGMEN

7、T DW 20H DUP(0)TOP LABEL WORD STACK1 ENDSCODE SEGMENT。MOV AX,STACK1;设置SSMOV SS,AXMOV SP,OFFSET TOP;设置SP,例:,注:空栈,SP指向栈底,15,(3)CS 的装载(设置CS和IP),使用结束伪指令END,格式如下:,END,执行转移类指令时,CPU自动修改CS和IP。,5.4.4 段组伪指令GROUP,把程序中不同段名的段组成一个段组,格式如下:,GROUP,段组名由程序设计人员设定;,可直接引用段名,也可用SEG/;,段组内各段间的程序转移可按段内转移处理;,段组内各段的数据存取操作可用同一个

8、段寄存器。,16,5.4.5 内存模式和简化段定义伪指令,1、内存模式伪指令,格式:.MODEL,6种模式:Tiny、Small、Medium、Compact、Large、Huge,确定用户程序中代码和数据在内存中的存放方式。,2、简化段定义伪指令,.CODE 段名;代码段,.DATA;数据段,已初始化数据,.DATA?;数据段,未初始化数据,.CONST;常数段,17,例:,.MODEL SMALL.STACK 20H;定义堆栈段.DATA;定义数据段.CODE;定义代码段BEGIN:MOV AH,4CHINT 21HEND BEGIN,.FARDATA 段名;远数据段,已初始化数据,.FA

9、RDATA?段名;远数据段,未初始化数据,.STACK长度;堆栈段,18,3、预定义符号,类似于EQU伪指令定义的等价符号,例如:,Model、Code、Data、Fardata、Stack、Codesize、Datasize,5.4.6 定位和对准伪指令,1、位置计数器($),2、定位伪指令(ORG),记录正在汇编的数据或指令的目标代码在当前段内的偏移地址。,$:表示位置计数器的当前值。,设置位置计数器的值,格式:ORG,19,位置计数器$:保存当前正在汇编的指令的地址 ORG$+8;跳过8个字节的存储区 JNE$+6;转向地址是 JNE 的首址+6 JMP$+2;转向下一条指令$用在伪操作

10、的参数字段:表示地址计数器的当前值,ARRAY DW 1,2,$+4,3,4,$+4,ARRAY,007E,0078,0074,20,ORG 伪指令:SEG1 SEGMENT ORG 10 VAR1 DW 1234H ORG 20 VAR2 DW 5678H ORG$+8 VAR3 DW 1357HSEG1 ENDSBUFFER LABEL BYTE ORG$+8 BUFFER DB 8 DUP(?),ORG 100HSTART:,21,3、对准伪指令(EVEN),功能:将位置计数器的值调整为偶数。,格式:EVEN,5.4.7 过程定义伪指令 PROC/ENDP,过程名 PROC NEAR/F

11、AR RET 过程名 ENDP,过程定义在逻辑段内;,过程名是必须的;,至少有一条返回指令RET。,格式:,3个属性:段、偏移地址、类型属性;,22,5.4.8 包含伪指令 INCLUDE,格式:INCLUDE,功能:将指定文件插入到正在汇编的源程序中。,5.4.9 标题伪指令 TITLE,格式:TITLE,功能:为程序指定标题。,不超过80个字符;,指定的标题在列表文件中每一页的第一行显示。,在源程序开始处使用;,23,第5节 宏指令,1、宏指令的使用过程,3步:宏定义、宏调用和宏展开,(1)宏定义,宏名 MACRO 形参1,形参2,ENDM,例:定义宏,交换两个存储单元的数据,XCHAGE

12、 MACRO MEM1,MEM2,REG MOV REG,MEM1 XCHG REG,MEM2 MOV MEM1,REG ENDM,24,(2)宏调用,宏名 实参1,实参2,,(3)宏展开(P226),宏汇编程序扫描宏指令语句(宏调用)时,用宏体的目标代码插入宏调用处;,对带参数的宏,用实参代替形参,并对宏体中出现参数的地方作适当修改。,例,可对前面定义的宏调用如下:,XCHAGE SI,DI,AX,25,(2)表达式操作符%(例),格式:%表达式,功能:告诉宏汇编程序获取表达式的值,而不是表达式本身。宏调用中,例:SHIFT_VAR MACRO R_M,DRECT,COUNT MOV CL,

13、COUNT S&DRECT R_M,CL ENDM,宏调用:SHIFT_VAR AX,HL,2 展开?,功能:在宏定义的宏体内连接形参。,(1)连接操作符&,2、宏操作符,26,;宏定义SHIF0 MACRO CNTMOVCL,CNTENDMSHIF1MACRO REG,DIRECT,NUMCOUNT=NUMSHIF0%COUNTS&DIRECTREG,CLENDM,;宏调用和宏展开SHIF1AX,HL,2MOVCL,2SHLAX,CLSHIF1BL,AR,3MOVCL,31SARBL,CL,27,(3)文本操作符,功能:将包含分隔符的实参括起来,作为一个单一的实参。,例:XCHAGE,DI,

14、AL,(4)字符操作符!(P229),格式:!字符,“!”后的字符不作操作符使用,而是字符本身。,3、LOCAL为指令(P229),格式:LOCAL,只能用于宏定义中,宏体第一条语句;,汇编时,符号展开为?XXXX 的形式。,28,MULTIPMACROMULT1,MULT2,MULT3LOCALLOP,EXIT0MOVDX,MULT1MOVCX,MULT2XORBX,BX;BX清零XORAX,AX;AX清零JCXZEXIT0;CX=0则跳到EXIT0LOP:ADDBX,DXADCAX,0LOOPLOPEXIT0:MOVMULT3,BXMOVMULT3+2,AXENDM,宏的功能:MULT1*

15、MULT2=AX:BXMULT3+2,MULT3,29,两次调用MULTIPMULTIPDA1,DA2,DA3MULTIPDA1+2,DA2+2,DA3+4按照标号的顺序分别用?0000?0001?0002?0003代替标号 LOP和EXIT0,4、宏库,通常用.MAC或.INC作为扩展名。,多个宏定义以文件形式组织成宏库。,使用时用INCLUDE伪指令。include 文件名,30,编制汇编语言程序的步骤:,(1)分析题意,确定算法(2)根据算法画出程序框图(3)根据框图编写程序(4)上机调试程序,第6节 汇编语言程序设计基本技术,31,分支结构 子程序结构,程序结构:,复合结构:多种程序结

16、构的组合,顺序结构 循环结构,32,例:试编制程序,计算下列公式的值,并将结果存放 在FUN存储单元中。F 其中X,Y,Z的值分别存放在VARX、VARY、VARZ三个字存储单元中,且计算过程的中间值和最后结果仍在16位二进制数的范围内。编制源程序如下:,TITLE EXAMPLE PROGRAM DATA SEGMENT;设置数据段 VARXDW 123H;变量X VARYDW 456H;变量Y VARZDW 789H;变量Z FUNDW?;结果单元 DATA ENDS STACK1 SEGMENT PARA STACK;设置堆栈段DW 20H DUP(0)STACK1 ENDS,33,CO

17、DESEGMENT;设置代码段ASSUME CS:CODE,DS:DATA,SS:STACK1START:MOV AX,DATA;置段基值于DSMOV DS,AXMOV AX,VARX;取变量XADD AX,VARY;AX(X+Y)MOV BX,AX;BX(X+Y)SAL AX,1;AX2*(X+Y)SAL AX,1;AX 4*(X+Y)ADD AX,BX;AX 5*(X+Y)SAL AX,1;AX 10*(X+Y)MOV BX,VARZ;取变量ZDEC BX;BX(Z1)MOV CX,BX;CX(Z1)SAL BX,1;BX 2*(Z1)ADD BX,CX;BX 3*(Z1)SUB AX,B

18、X;AX 10*(X+Y)3*(Z1)SAR AX,1;AX 10*(X+Y)3*(Z1)/2MOV FUN,AX;存放计算结果MOV AH,4CH;终止用户程序,返回DOSINT 21HCODEENDSEND START,34,例:用查表方法将一位十六进制数(09,AF)转换成它对应的ASCII码。,首先在数据段建立一个表TABLE,按照十六进制数从小到 大(即从09到AF)的顺序,在表中存入它们对应的ASCII码值(十六进制数用大写英文字母AF)。为查出某个数的ASCII码,需计算它在内存中的地址。,用简化段定义伪指令,编制源序如下:,.MODEL SMALL;设置内存模式.DATA;设置

19、数据段TABLE DB 30H,31H,32H,33H,34H,35H,36H,37H DB 38H,39H,41H,42H,43H,44H,45H,46HHEX DB 4ASCI DB?,35,.STACK 100H;设置堆栈段.CODE;设置代码段START:MOVAX,DATAMOVDS,AXLEABX,TABLE;取表首址XORAH,AH;AH清零MOVAL,HEX;取一位十六进制数ADDBX,AX;确定查表位置MOVAL,BX;查表MOVASCI,AL;存结果MOVAH,4CH;终止程序,返回DOSINT21HENDSTART,;基址寻址xor bx,bxmov bl,hexmov

20、al,tablebx,寄存器间址,36,5.6.3 分支程序设计,1、转移指令,无条件转移指令,条件转移指令,直接寻址,间接寻址,段内转移,段间转移,单条件转移指令,无符号数条件转移指令,符号数条件转移指令,段内转移,段间转移,37,(1)无条件转移指令,格式:JMP 目标地址,目标地址有两种表达方式,a.直接寻址:,目标地址通常是标号,段内转移:,相对转移,指令给出位移量DISP;,执行操作:IP(IP)+DISP,段间转移:,指令中给出目标地址的段基值和偏移地址;,执行操作:IP 偏移地址 CS 段基值,例如:JMP NEXT,;NEXT为标号,JMP指令的下一指令与目标地址所指的指令之间

21、的字节距离,38,b.间接寻址:,目标地址通常由寄存器或存储单元提供,段内转移:,寄存器或存储字单元提供偏移地址,执行操作:IP 偏移地址,段间转移:,由一个双字单元提供目标地址的段基值和偏移地址;,执行操作:IP 偏移地址 CS 段基值,(2)条件转移指令,格式:Jxx 目标地址,只能在段内转移,而且是相对转移。,xx为转移条件,39,a.单条件转移指令,40,b.无符号数条件转移指令,指 令 转 移 条 件 含 义,JA/JNBE CF=0 AND ZF=0 AB转移,JAE/JNB CF=0 OR ZF=1 AB转移,JB/JNAE CF=1 AND ZF=0 A B转移,JBE/JNA

22、 CF=1 OR ZF=1 AB转移,c.符号数条件转移指令,指 令 转 移 条 件 含 义,JG/JNLE SF=OF AND ZF=0 AB转移,JGE/JNL SF=OF OR ZF=1 AB转移,JL/JNGE SFOF AND ZF=0 A B转移,JLE/JNG SFOF OR ZF=1 AB转移,41,Topic:Jump Conditions Mnemonic Flags Checked Description-JB/JNAE CF=1 Jump if below/not above or equal(unsigned comparisons)JAE/JNB CF=0 Jump

23、 if above or equal/not below(unsigned comparisons)JBE/JNA CF=1 or ZF=1 Jump if below or equal/not above(unsigned comparisons)JA/JNBE CF=0 and ZF=0 Jump if above/not below or equal(unsigned comparisons)JE/JZ ZF=1 Jump if equal(zero)JNE/JNZ ZF=0 Jump if not equal(not zero)JL/JNGE SF OF Jump if less/no

24、t greater or equal(signed comparisons)JGE/JNL SF=OF Jump if greater or equal/not less(signed comparisons)JLE/JNG ZF=1 or SF OF Jump if less or equal/not greater(signed comparisons)JG/JNLE ZF=0 and SF=OF Jump if greater/not less or equal(signed comparisons)JS SF=1 Jump if sign JNS SF=0 Jump if not si

25、gn JC CF=1 Jump if carry JNC CF=0 Jump if not carry JO OF=1 Jump if overflow JNO OF=0 Jump if not overflow JP/JPE PF=1 Jump if parity/parity even JNP/JPO PF=0 Jump if no parity/parity odd-,42,2、分支程序设计,(1)比较/测试分支结构,比较/测试分支结构程序流程,为什么不用移位,然后判断CF?,条件转移指令,CMP/TEST,43,例:编程序段,把DA1字节数据变为偶数。,分析:若二进制数最低位为0,则为

26、偶数。,程序段流程,程序段如下:,TEST DA1,01H JE/JZ NEXT INC DA1 NEXT:,例:设数据段中NUM1,NUM2两字节单元中有 无符号整数,编程完成下面的操作:,44,如两个数均是偶数,两个数加1后分别送入 DA1、DA2字节单元中;,如两个数均是奇数,两个数分别直接送入DA1、DA2字节单元中;,如一个是奇数,一个是偶数,则奇数直接送 DA1字节单元,偶数直接送DA2字节单元。,分析:依次测试NUM1和NUM2的奇偶性,有4种情况。,NUM1,奇,偶,NUM2,偶,DA1NUM1,DA2NUM2,DA1NUM1,DA2NUM2,DA1NUM2,DA2NUM1,D

27、A1NUM1+1,DA2NUM2+1,奇,偶,奇,45,根据分析,画出流程图如下:,程序段如下:,MOV AL,NUM1MOV AH,NUM2TEST AL,01HJNE END0TEST AH,01HJNE L1 INC ALINC AH JMP END0L1:XCHG AL,AHEND0:MOV DA1,ALMOV DA2,AH,L1,END0,46,(2)用跳转表形成多路分支结构,假设某程序根据不同情况在5个计算公式中选择1个。可编制5个程序段,分别完成1个公式的运算。在程序中构造跳转表,有两种情况。,例:由分支的入口地址构成跳转表。,跳转表在数据段,表中每一项都是一个分支的偏移地址。,

28、为转移到第N个公式,需先找到该分支的入口地址。入口地址在跳转表中的偏移量为2*(N-1)。,47,数据段如下:,DATASEGMENTJUMP_TABLEDW SUB1,SUB2,SUB3,SUB4,SUB5PARAMDB 3DATAENDS,实现多路分支的程序段如下:,XORAX,AXMOVAL,PARAM;取参数DECAL;计算2*(PARAM-1)SHLAL,1MOVBX,OFFSET JUMP_TABLEADDBX,AXMOVAX,BX;取转移的入口地址JMPAX;间接转移到分支入口,MOV AX,WORD PTR TABLESI*2,48,例:由转移指令构成跳转表的多路分支程序设计。

29、,跳转表在代码段,表中每一项都是JMP指令代码。,为转移到第N个公式,需先转移到跳转表中对应的JMP指令(在表中的偏移量为3*(N-1),再通过这里的JMP指令转移到对应的计算公式。,实现多路分支的程序段如下:,XOR BX,BX MOV BL,PARAM;取参数 DEC BL;参数减1 MOV AL,BL;再乘3 SHL BL,1 ADD BL,AL ADD BX,OFFSET JUMP_TABLE JMP BX;转至跳转表JUMP_TABLE:JMP SUB1;转至分支,49,5.6.4 循环程序设计,1、循环控制指令,(1)LOOP指令,属于程序转移类指令,格式:LOOP 目标地址,例:

30、编制程序,产生n个数据的裴波纳契数列。,裴波纳契数列中,a1=0,a2=1,从第3个数开始,an=an-1+an-2。,数据段中数据定义如下:,FIBONA DW 100 DUP(0);存放数列NUM DB 20H;数据个数,功能:循环计数(CX减1)后,判断循环是否结束:若(CX)=0,则继续循环,否则顺序执行。,50,产生数列的程序段如下:,XOR CX,CXMOV CL,NUMLEA DI,FIBONAMOV AX,0MOV BX,1LOP:MOV DI,AX ADD AX,BX XCHG AX,BXADD DI,TYPE FIBONALOOP LOP,51,(2)LOOPE/LOOPZ

31、指令,格式:LOOPE 目标地址 LOOPZ 目标地址,例:编程,在字符串中查找第一个非空字符,并将其在字符串中序号(1n)送入INDEX单元。若未找到非空字符,则将全1送入INDEX单元。,分析:逐个字符与空字符(ASCII码为20H)进行比较,用LOOPE 循环指令。循环结束有两种情况:计数为0或找到非空字符,再进一步分析。,功能:循环计数(CX减1)后,判断循环是否结束:若(CX)=0 且 ZF=1,则继续循环,否则顺 序执行。,52,MOV CX,COUNT MOV BX,-1NEXT:INC BX CMP STRINGBX,20H LOOPE NEXT JNE OK MOV BL,0

32、FEH;未找到OK:INC BX MOV INDEX,BL;存结果,程序段:,数据段中数据定义如下:,STRING DB CHECK STRING COUNT EQU$-STRINGINDEX DB?;存结果,53,(3)LOOPNE/LOOPNZ指令,格式:LOOPNE 目标地址 LOOPNZ 目标地址,例:设数据段中有一个以ARRAY为首地址的字节数组。现要求编制一程序,对数组中每一数据除以0FH,用它的余数构造一个新数组YUSHU。当ARRAY数组中数据处理完毕,或某次相除时余数为0,便停止构造新数组。程序最后将新数组的数据个数存放在LEN单元中。,功能:循环计数(CX减1)后,判断循环

33、是否结束:若(CX)=0 且 ZF=0,则继续循环,否则顺 序执行。,分析:对数组元素依次作除法,判断余数是否为0。用循环指令LOOPNZ控制循环,结束循环后,再进一步分析。,54,MOV CX,NUM XOR BX,BX MOV DL,0FHNO_ZERO:MOV AL,ARRAYBX XOR AH,AH DIV DL;除0FH MOV YUSHUBX,AH INC BX CMP AH,0;余数为0吗?LOOPNE NO_ZERO JNE END0;有余数为0?DEC BL;有余数为0END0:MOV LEN,BL,数据定义如下:,ARRAY DB 12H,NUM EQU$-ARRAYYUS

34、HU DB NUM DUP(0)LEN DB?,程序段:,55,2、循环程序结构,(4)JCXZ指令,格式:JCXZ 目标地址,测试寄存器CX的内容,56,3、循环控制方法,(1)计数控制循环,例:编程,统计数组中相邻两数之间的符号变化的次数。,MOV CX,COUNT-1XOR BL,BLEXCHANG:MOV AL,SI XOR AL,SI+1 TEST AX,80H JE NEXT INC BLNEXT:INC SI LOOP EXCHANG,程序段:,57,(2)条件控制循环,每循环一次,测试并判断循环终止条件是否成立。,例:编程,产生给定数以内的裴波纳契数列,并把数列的个数存入LEN

35、单元中。,分析:循环次数事先未知,只能用条件控制循环。循环终止条件:当新产生的数据大于给定数,则结束循环。,程序段:,LEA DI,FIBOINAXOR CL,CLMOV AX,0MOV BX,1LOP:MOV DI,AXXCHG AX,BXADD AX,BXADD DI,TYPE FIBONAINC CLCMP AX,NUM;测试JA END0;大于,结束JMP LOP;小于,继续END0:MOV LEN,CL,58,BX,1234,实验 循环与分支程序设计把 BX中的二进制数以十六进制的形式显示在屏幕上,0 0 1 1 0 1 0 1 1 0 1 0 1 1 0 0,35AC,59,开始,

36、初始化循环计数值,结束,Bx循环左移4位,加上30H,显示一个字符,最右边的数大于9,循环计数值=0?,N,Y,N,Y,加上7H,60,mov ch,4;循环次数(计数控制)rotate:mov cl,4;设置移位次数 rol bx,cl mov al,bl;不取到AL可否?and al,0fh;取bx中的最低四位 cmp al,9h jle printit add al,7h;AF ASCII 41H46Hprintit:add al,30h;09 ASCII 30H39H mov dl,al mov ah,2 int 21h dec ch jnz rotate,用LOOP实现循环?.386

37、,61,mov Cx,4;循环次数(计数控制)rotate:.386;设置移位次数 rol bx,4 mov al,bl;不取到AL可否?and al,0fh;取bx中的最低四位 cmp al,9h jle printit add al,7h;AF ASCII 41H46Hprintit:add al,30h;09 ASCII 30H39H mov dl,al mov ah,2 int 21h loop rotate,用LOOP实现循环?.386,62,mov bx,0newchar:mov ah,1;键盘输入 int 21h sub al,30h jl exit;9退出 cbw xchg a

38、x,bx mov cx,10 mul cx;ax*cx xchg ax,bx add bx,ax jmp newcharexit:,例:从键盘接收十进制数并存入 BX,(010)+1)10+2)10+5,63,mov bx,0newchar:mov ah,1;键盘输入 int 21h sub al,30h jl exit;f退出add_to:mov cl,4 shl bx,cl mov ah,0 add bx,ax jmp newcharexit:,例:从键盘接收十六进制数并存入 BX,1 a f31 61 66,(016)+1)16+0a)16+0f,64,x dw?array_head d

39、w 3,5,15,23,37,49,52,65,78,99array_end dw 105n dw 32,例:将正数 n 插入一个已整序的正数字数组,105,array_head,array_end,n,x,65,例:将首地址为A的字数组从小到大排序(气泡算法,多重循环)32,85,16,15,8,66,回忆:过程定义伪指令,5.6.5 子程序设计,67,68,1、调用与返回,返回指令格式:RET,调用指令格式:CALL 子程序名/过程名,带参数的返回指令格式:RET n,(1)段内调用与段内返回,执行操作:保留段点的偏移地址(当前IP值),IP子程序入口地址的偏移地址。,段内直接调用:,入口

40、地址直接由子程序名提供,段内间接调用:,入口地址由寄存器/存储单元提供,段内返回:,IP(SP),SP(SP)+2,SP(SP)+n,;N为偶数,69,(2)段间调用与段间返回,执行操作:保留段点的地址(当前CS/IP值),CS 子程序入口地址段基值;IP 子程序入口地址的偏移地址。,段间直接调用:,入口地址直接由子程序名提供,段间间接调用:,入口地址由双字单元提供,段间返回:,IP(SP),SP(SP)+2;CS(SP),SP(SP)+2;SP(SP)+n,70,2、子程序设计方法,(1)适当地划分并确定子程序功能,(2)选择适当的参数传递方法 入口参量,返回参量 a.使用通用寄存器 b.使

41、用存储单元 c.使用堆栈,(3)信息的保存 a.调用子程序之前保存,从子程序返回后恢复 b.进入子程序后保存,返回指令之前恢复,(4)编写子程序的文字说明,subt proc far push ax push bx push cx push dx pop dx pop cx pop bx pop ax retsubt endp,71,3、子程序设计举例,(1)使用寄存器传递参量,例:编程,对数据段中一组字数据用减奇数法求平方根,结果(平方根)依次存入PFG的字节数组中。,分析:把求平方根的运算作为一个子程序;,入口参量(AX):被开方数;出口参量(CL):平方根。,减奇数法开平方的算法:被开方

42、数S逐个减去1开始的连续自然数的奇数1,3,5,直到相减结果等于0,或不够减下一个奇数为止。够减的次数就是S的近似平方根。,72,DATASEGMENTDA1DW1234H,5678H,3456H,0A53HCOUNTEQU($-DA1)/2PFGDBCOUNTDUP(0)DATAENDSSTACK1SEGMENTPARASTACKDW20HDUP(0)STACK1ENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACK1BEGIN:MOVAX,DATAMOVDS,AXMOVCX,COUNTLEASI,DATA1LEADI,PFG,73,主程序段:,LOP:M

43、OV AX,SI;寄存器传递入口参数 PUSH CX;保存信息 CALL SQR_PROC MOV DI,CL;存结果 POP CX;恢复信息 ADD SI,2 INC DI LOOPLOP,子程序段:,SQR_PROC PROCXOR CL,CLMOV DX,1 SQR:SUB AX,DX;减奇数 可以 CMP AX,DX?JB EXIT;够减?INC CL;够减,计数 ADD DX,2;形成下一奇数 JMP SQR;继续循环EXIT:RETSQR_PROCENDP,74,(2)使用存储单元传递参量,对上一例,入口参量(被开方数KFS)和出口参量(平方根SQRT)用存储单元传递,程序修改如下

44、:,主程序段:,LOP:MOV AX,SI MOV KFS,AX CALL SQR_PROC MOV AL,SQRT MOV DI,AL,子程序段:,SQR_PROC PROCMOV AX,KFSMOV SQRT,0MOV DX,1 SQR:SUB AX,DX JB EXITINC SQRT SQR_PROCENDP,75,(3)使用地址表传递参量,参量较多时,先把参量所在的地址组成一个地址表,将地址表的首地址传递给子程序。,例:编程,将两个8位和16位的二进制数分别转换 为相应二进制数的ASCII码。,分析:主程序提供待转换数据、数据位数和转换后存放ASCII码的首址等3个参数的地址,并组成

45、组成一个地址表,传递地址表首地址给子程序。,设数据定义如下:BIN8 DB 35HBIN16 DW 0AB48HNUM DB 8,16ASCBUF DB 20H DUP(0)ADR_TABDW 3 DUP(0),76,主程序段:,MOV ADR_TAB,OFFSET BIN8MOV ADR_TAB+2,OFFSET NUMMOV ADR_TAB+4,OFFSET ASCBUFMOV BX,OFFSET ADR_TAB;通过BX传递地址表首址CALL;子程序调用,子程序段:,MOV DI,BX;取二进制数地址MOV DH,DI;取二进制数MOV DI,BX+2;转换位数的地址MOV CL,DI;

46、转换位数MOV DI,BX+4;ASCII码首地址,77,(4)使用堆栈传递参量,将前一例该为用堆栈传递参量。,主程序段:,MOV AH,BIN8XOR AL,ALPUSH AXLEA AX,ASCBUFPUSH AXMOV AX,8PUSH AXCALL BINASC,子程序段:,PUSH BPMOV BP,SP MOV DX,BP+14MOV DI,BP+12 MOV CX,BP+10,78,5.6.6 系统功能子程序调用,两组功能子程序,通过软中断指令INT实现功能调用。,送入口参数给指定寄存器,AH=功能号,INT n,功能调用步骤如下:,n为中断类型码,值为000FFH,软中断指令格

47、式如下:,INT n,79,5.6.7 汇编语言程序的开发,1、编辑建立源程序,编辑程序:EDIT等;,按逻辑段来组织源程序;,以END语句结束源程序;,源文件扩展名为.asm,且不能省略。,80,2、汇编生成目标程序,主要功能,生成文件,目标文件(.OBJ),列表文件(.LST),交叉引用文件(.CRF),汇编程序:MASM,格式:MASM*.ASM,81,3、连接生成可执行程序,连接程序:LINK,格式:LINK*.OBJ,若需连接多个OBJ文件,则用“+”连接。,生成的主要文件,可执行文件(.EXE),内存映像文件(.MAP),4、调试与运行,调试程序:DEBUG,(1)DEBUG的进入

48、与退出,D:DEBUG,-N TEST.EXE,进入DEBUG,出现提示符-,装载文件:,-L,82,D:DEBUG TEST.EXE,进入DEBUG时,同时装载文件:,退出DEBUG并返回操作系统:,格式:-Q,(2)显示命令,D 命令显示内存单元内容,例:-D DS:100-D 100-D DS:100 10F,格式:D 地址 或 D 范围,83,R 命令显示寄存器内容,格式:-R,显示所有寄存器内容、标志位情况及下一条指令。,AX102A BX0000 CX0100 DX0000 SP0040 BP0000 SI0000 DI0000 DS1528 ES1428 SS1723 CS182

49、2 IP0003 NV UP DI PL NZ NA PO NC1822:0003 8ED8 MOV DS,AX,U 命令显示汇编源程序命令(反汇编),例:-U CS:0 反汇编32个字节-U CS:0 10 偏移量0-10H的单元-U CS:0 L 10 前10H个字节的代码,格式:U 地址 或 U 范围,84,(3)修改命令,E 命令修改内存单元内容,例:-E DS:0,格式:E 地址 内容表,1200:100 20 31;将20H修改为31H,R命令修改寄存器内容,例:-R AX AX 0000;显示AX原有内容:1111;修改AX内容,格式:R,85,A命令汇编命令,格式:A 地址,例:-A CS:1001723:0100 MOV AX,291723:0103 MOV BX,851723:0106 ADD AX,BX1723:0108,(4)程序运行命令,G命令连续运行方式,格式:-G=地址,地址,地址,T命令跟踪运行方式,格式:-T=地址 值,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号