第5讲汇编语言程序设计.pptx
《第5讲汇编语言程序设计.pptx》由会员分享,可在线阅读,更多相关《第5讲汇编语言程序设计.pptx(135页珍藏版)》请在咨信网上搜索。
1机器语言、汇编语言、高级语言机器语言和汇编语言程序是一系列指令组成的。机器语言是计算机能够理解和执行的语言。汇编语言的基础是机器语言,只是用助记符来表示指令的操作,比机器语言便于使用。汇编语言效率高,占用内存小在各种实时系统中,经常使用汇编语言学习汇编语言,可以更好地理解计算机组成和工作原理。2机器语言、汇编语言、高级语言汇编和连接汇编是将汇编源程序翻译为机器代码,即目标程序;目标程序必须经过连接,才能生成可执行文件;连接是将目标程序和库文件等连接为可执行程序;EXE文件除了程序外还有一个程序段前缀PSP,PSP长度为256字节。前2个字节是一条INT 20H指令。3汇编语言源程序结构汇编语言源程序结构 4汇编语言的语句格式汇编语言共有三种语句类型 指令语句 伪指令语句 宏指令语句1.指令语句及其格式 指令语句即8086CPU的指令,每一条指令即可构成一指令语句。每一指令都有对应的机器代码。指令语句格式 标号:助记符 操作数,;注释格式共有四部分:其中标号,操作数,注释可以是任选项;助记符是必选项,该项在一条语句中不可省略。标号最多由31个字母和数字字符构成。还可以使用?_$等字符。标号后面一定要跟一个冒号;注释前一定加一分号。52、伪指令语句及其格式 伪指令语句不是真正的指令语句,它不产生机器代码,它是汇编程序要求的,用来指示汇编程序做何种操作 伪指令语句格式 名字名字 伪指令伪指令 操作数,操作数,操作数,操作数 ;注释注释 说明:格式共有四部分:其中名字,操作数,注释可以是任选项;伪指令是必选项,该项在一条伪指令语句中不可省略。对于有些语句,名字也是必需的。名字后面不要跟冒号:注释前一定加一分号;各个参数之间用,分开。标号与名字或其他变量必须由字母或特殊字符打头的字母数据串,中间不能有空格,合法的字符包括:字母 AZ 或 az;数字 09 特殊字符:?.$_ ;圆点(.)只能作为第一个字符。63、宏指令语句及其格式宏指令语句:为了书写方便,把一个重复出现的汇编语句序列用一条指令代替,这种重新定义的指令就称为宏指令。这种由宏指令组成的语句称为宏指令语句。宏指令必须先定义,才能被使用,这称为宏定义;在汇编时,又要把宏指令语句进行宏展开,生成对应的机器代码。宏指令语句格式将在后面应用中介绍。7常用伪指令语句一、符号定义语句 1、赋值语句(EQU)格式:符号名 EQU 表达式说明:EQU语句给符号定义一个值或其他符号名,甚至定义一条可执行指令等。它把表达式赋给符号名。在程序中,在程序中,EQU对一个符号名只许定义一次对一个符号名只许定义一次。例如 :COUNT EQU 20 BLOCK DB READ AFTER ME NUM EQU$-BLOCK 8常用伪指令语句(续)2、等号语句(=)格式:符号名=表达式 说明:此语句的功能与 EUQ 类似,但该语句在一个程序中可以对同一符号名多次再定义。例如 A1=10 ;A1 定义为 10 A1=100 ;A1重定义为100 A1 EQU 20;出错,因为A1已定义过,不能再用EQU重新定义。9常用伪指令语句(续)二、数据定义语句 1、定义字节语句(DB-Define Byte)格式:符号名格式:符号名 DB 表达式表达式 说明:数据定义语句(或称数据伪指令或变量定义伪指令),它可以是DB、DW、DD、DQ、DT。表达式可以是下列情况之一:一个常数表达式;问号(?)作为非确定的初始值;一个或多个字符的字符串(只限于DB类型);重复子句:重复次数 DUP (表达式)(Duplicate)10常用伪指令语句(续)举例:ONE DB 1,2,3,4,5 ;TWO DB A ;THREE DB Welcom you!;FOUR DB?,?;SIX DB 50 DUP(5,6,7);DATA1 DB 10 DUP(?);DATA2 DB 20 DUP(5);DATA3 DB 100 DUP(STACK);11常用伪指令语句(续)二、数据定义语句(续)2、定义字语句(DW-Define Word)格式:符号名 DW 表达式 说明:定义字语句,与DB类似,只不过定义一个字(二个字节),其格式与表达式和DB相似。例如 BUF DW 1122,3344,5566 ;定义了3个字(16位)常数 BUF1 DW 128*4 ;定义了一个常数表达式,由汇编来运算。BUF2 DW 100 DUP(?);定义了100个字单元,占用了200个内 存单元,每个单元的内容是不确定的。12常用伪指令语句(续)3、定义双字(DD),四个字(DQ),10个字节(DT)DD(Define Doubleword);定义双字(4个字节)DQ(Define Quadword);定义4个字(8个字节)DT (Define Tenbyte);定义10个字节 DD,DQ,DT 的格式、表达式及用法与DB,DW语句类似。13常用伪指令语句(续)三、段定义语句 1、段定义语句 格式:段名 SEGMENT 定位类型 连接方式 类别 段名 ENDS 说明:这两个伪操作总是一起出现。该语句将汇编语言源程序分成段,由该语句规定哪个段是代码段,哪个段是数据段或堆栈段。段名不能省略,由编程者自己指定段名,两处段名必须一致。方括号中的三项是可选项,是赋给段名的属性。各项顺序不能错,且用空格分开。14常用伪指令语句(续)1、段定义语句(续)定位类型 表示此段的起始边界要求,可以是PAGE,PARA,WORD或BYTE之一。它们表示如下的地址要求:PAGE=0000 0000 B PARA=0000 B (默认值)WORD=0B BYTE=B 它们分别表示以页、节、字、字节为段的地址边界,若此 项省略,则默认值为PARA(paragraph)。15常用伪指令语句(续)连接方式 用来告诉连接程序(LINK)本段与其他段的关系分别有 六个选项(NONE,PUBLIC,COMMON,AT表达式,STACK,MEMORY)NONE 本段与其他段逻辑上没有关系,每段都有自己的基地址。(默认值)PUBLIC 把本段与同名同类别的其他段连接成一个段。COMMON 为本段和同名同类型的其他段指定相同的基址。各段会产生覆盖。AT表达式 把本段放在表达式的值所指定的地址上(偏移量按 0 处理),STACK 此段为堆栈段,LINK要求被连接的程序至少有一个STACK段。MEMORY 把本段定位在所有其他段之上。16常用伪指令语句(续)类别 需用单引号括起来,在几个模块连接时才需要,若不准备和其他程序组合,可以不指定类别。当几个程序模块进行连接时,具有相同类别名的逻辑段装入连续的内存区,类别名相同的逻辑段,按先后出现的顺序排列。没有类别名的逻辑段,与其它无类别的逻辑段一起连续装入内存。类别名可以由用户任意设定,但是一般对于堆栈段为:STACK,代码段为:CODE,数据段为:DATA17常用伪指令语句(续)2.段寻址语句(ASSUME)格式:ASSUME 段寄存器:段名,说明:由于段名是任意的,汇编程序并不知道哪个段名对应哪个段,所以要用ASSUME伪指令来指明段寄存器与段名之间的关系。该语句必须写在代码段中,一般在段定义语句之后。段名可以是SEGMENT定义的一个段名,或用GROUP定义的一个组名。段寄存器可以是CS,DS,SS,ES 之一。例如 ASSUME CS:CODE,DS:DATA,SS:STACK,ES:DATA 18常用伪指令语句(续)设置段地址ASSUME伪指令仅仅指出各逻辑段应该装填的地址,但是并未给相应的段寄存器赋值;在程序代码段开始时应当对DS,ES,SS进行段基址装填,CS则在加载程序后由系统自动装填。SS也可以由系统自动装填,但是在定义堆栈段时,必须把参数写全:STACK SEGMENT PARA STACK STACK19常用伪指令语句(续)3.定义偏移地址语句(ORG-origin)格式:ORG 表达式 说明:该语句指定了在它之后的程序段或数据块存放的起始地址的偏移量(0000h0FFFFH),语句中表达式的值就是起始地址,从该地址连续存放程序或数据,除非遇到一个新的ORG语句。例如 DATA SEGMENT ORG 1000H BUF DB 10 DUP(20H)DATA ENDS 20举例DATA SEGMENT ORG 100H X DB 12H Y DW?ORG 200H Z DD 9C56HDATA ENDS 21常用伪指令语句(续)四、过程定义语句 格式:过程名 PROC(NEAR/FAR);缺省值为NEAR RET 过程名 ENDP 说明:该语句的PROC与ENDP必须成对出现,过程名前后必须一致。该语句实际上是定义了一个子程序,该过程可以被其他程序调用。属性可以是NEAR或FAR,表示该过程可以被段内调用或段间调用。例如 SUBPROG PROC FAR 主程序如下 CODE SEGMENT RET ASSUME CS:CODE,DS:DATA SUBPROG ENDP 以上定义了一个名为 CALL SUBPROG SUBPROG的过程 CODE ENDS 22常用伪指令语句(续)五、结束语句 格式:END 表达式 说明:该语句表示整个源程序的结束,它告诉汇编程序汇编任务到此结束。表达式必须是源程序的启动地址。如果几个模块连接在一起,则只能指定主模块的启动地址。其他模块不能有启动地址。如果不使用选择项表达式,则没有启动地址传递给 LINK。程序就不知道从何处启动。例如 END START ;START为源程序的启动地址。23汇编源程序基本结构汇编源程序是一种分段结构。一般都会包括数据段、堆栈段和代码段。DATA SEGMENTDATA ENDSSTACK SEGMENTSTACK ENDSCODE SEGMENT CODE ENDS END 24汇编源程序基本结构数据段中定义程序所使用的变量、数组、常数、表格等。也可以保留必要的内存单元。DATA SEGMENTBLOCK DW 28H,139H,0 DW 3010H,1122HCOUNT EQU ($-BLOCK)/2SUM DW?TABLE DW 0,1,8,27,64 DW 125,216,343 DW 512,729DATA ENDS25汇编源程序基本结构堆栈段中定义堆栈的大小。也可以直接定义SP的位置,如右边的示例。但并不需要。STACK SEGMENT PARA STACKAREA DB 64 DUP(?)SPT EQU$-AREASTACK ENDS-r AX=0000 BX=0000 CX=0089 DX=0000 SP=0040 BP=0000 SI=0000 DI=0000 DS=14F9 ES=14F9 SS=150A CS=150E IP=0000 NV UP EI PL NZ NA PO NC150E:0000 B364 MOV BL,6426汇编源程序基本结构代码段中应包括:ASSUME语句;至少一个过程,即PROC;对段地址寄存器(DS、SS、ES)赋值;准备返回DOS系统的指令;实现程序功能的指令。CODE SEGMENT ASSUME CS:CODE,DS:DATAMAIN PROC FAR MOV AX,DATA MOV DS,AX MOV AH,4CH INT 21H RETMAIN ENDPCODE ENDS27汇编语言源程序结构任何一个汇编语言源程序可以由若干个段组成,至少应该包含一个代码段,堆栈段和数据段视需要而定如果使用堆栈,最好用户自行设置堆栈空间,如果用户不设置,则使用系统堆栈空间。28EXE程序汇编和连接后生成可执行文件(.exe)EXE文件有两部分组成:程序段前缀(PSP,Program Segment Prefix)和装入模块PSP:由连接程序生成,含有文件的控制信息和重定位信息。偏移地址空间:00HFFH;DOS利用PSP对有关数据进行重新定位。第一个单元存放着DOS返回指令INT 20H装入模块:程序本身;DOS从100H开始装入程序本身。29EXE程序(续)EXE文件装入内存时,DS、ES指向PSP,而不是程序的数据段和附加段,所以要在程序中根据实际的数据段和附加段改变相应的DS、ES。标准程序前奏:由于装载时将DS、ES指向PSP的起点,因此应当在程序开始时将PSP的起点地址压入堆栈,从而在返回时,返回DOS:PUSH DSSUB AX,AXPUSH AXCS、IP指向代码段程序开始执行的指令,SS,SP指向堆栈段。源程序中如果没有堆栈段,则SS=PSP段地址,SP=100H。30COM程序COM程序结构程序规模较小,且不用与外部模块装配,可以把各段包括在代码段内,编译为COM程序。COM程序的结构COM程序不允许定义堆栈段。COM程序更紧凑,执行速度快COM程序不超过64KBPSPPSP00DOS暂驻部分00IP=0100HCS,DS,ES,SS64KBSP=0FFFEH用户程序区64KBRAM低端RAM高端256字节31数据定义常量十六进制第一个字符必须是数字,否则要加数字“0”。常量若是ASCII码字符串,要用或“”括起来。变量代表一个内存单元,编译后就是一个地址内存单元,有段地址和段内偏移量,还有类型即字节数,1(字节变量)2(字变量)4(双字变量)标号代表代码段内某条指令的地址,也有三个属性:段地址、段内偏移量和类型。类型有两种:NEAR标号(-1,只在段内引用)和FAR标号(-2,可在段内、段间引用)。常量、变量、标号不能使用保留字。32运算符算术运算符 *MOD(模)SHL(左移)SHR (右移)如:PI_REM EQU 314156 MOD 100000 MASKB EQU 00110010BMASKB1 EQU MASKB SHL 2MASKB2 =MASKB SHR 2逻辑运算符AND 逻辑与 OR 逻辑或 XOR 逻辑异或 NOT 逻辑非 逻辑运算符在汇编时完成运算,逻辑运算指令在执行时完成。MASKB EQU 00101011BMOV AL,5EHAND AL,MASKB AND 0FH33运算符关系运算符EQ等于NE不等 LT小于 GT大于 LE小于等于 GE大于等于产生真(0FFFFH)和假(0000H)两种结果如:MOV AX,(CHOICE LT 20)AND 5)OR (CHOICE GE 20)AND 6)34运算符值返回运算符1、$运算符(返回汇编器当前地址计数器的值)2、SEG和OFFSET运算符 SEG 返回变量或标号的段地址 OFFESET 偏移地址3、TYPE的运算符返回变量或标号的类型。4、LENGTH和SIZE运算符只对DUP定义的变量有意义。LENGTH返回元素的个数,SIZE返回变量的字节数,即LENGTH与TYPE的乘积。5、HIGH(16位的高字节)和LOW(16位的低字节)运算符SEG 返回变量或标号的段地址OFFESET 偏移地址MOV AX,SEG TABLEMOV BX,OFFSET TABLE如:AB DD 1MOV AX,TYPE AB如:TABLE DW 100 DUP(?)MOV CX,LENGTH TABLEMOV CX,SIZE TABLE如:NUM EQU 0CDEFHMOV AH,HIGH NUMMOV AL,LOW NUM35运算符属性运算符PTR运算符用于暂时改变变量或者标号的原有属性格式:格式:新属性新属性 PTR PTR 表达式表达式如:F1 DW 1234H F2 DB 23H,56H,18H MOV AL,BYTE PTR F1 MOV BX,WORD PRT F2 JMP FAR PTR SUB1MOV BYTE PTR SI,100MOV WORD PTR SI,10036运算符LABEL运算符 对已定义的内存单元属性重定义,并取新名。本身不分配内存单元。如:CFB LABEL BYTEDFW DW 4567HEFW LABEL WORDFFB DB 89H,40HTHIS运算符 新属性放在右边如:FIRST EQU THIS BYTESECOND DW 5678HMOV BL,FIRSTMILES EQU THIS FARCMP SUM,100(64K)JMP MILES37运算符属性运算符段超越运算符,强迫当前指令的操作数的寻址按照超越运算符指定的段寻址。如:MOV AX,ES:BXSHORT运算符 通知汇编器,转移目标在-127+128之间(段内相对转移)如:JMPSHORT F138基本结构程序设计顺序结构程序设计32位无符号数的乘法8086只能直接进行16位数的乘法。32位数的乘法要通过16位数的乘法来实现。32位数相乘的结果是64位。39DATASEGMENTNUM1DW8000H,8000HNUM2DW8008H,8000HMUTDW4 DUP(0)DATAENDSSTACKSEGMENTDB100 DUP(s)STACKENDSCODESEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTAPROC FARPUSH DSXORAX,AXPUSH AX40MOV AX,DATAMOV DS,AXLEABX,NUM1MOV AX,BXMOV SI,BX+4MOV DI,BX+6MUL SI;低16位乘低16位MOV BX+8,AXMOV BX+10,DXMOV AX,BX+2;乘数的高16位MUL SI;高16位乘低16位ADDBX+10,AXADCBX+12,DX41MOV AX,BXMUL DI;低16位乘高16位ADDBX+10,AXADCBX+12,DXADCWORD PTRBX+14,0MOV AX,BX+2MUL DI;高16位乘高16位ADDBX+12,AXADCBX+14,DXRETSTAENDPCODEENDSENDSTA42例例.查表求平方值查表求平方值DATA SEGMENTTABLESQDB 0,1,4,9,16,25,36,49,DB 64,81,100,121,144,169,196,225XXDB X ;X为为015的正整数的正整数YYDB?DATAENDSSTACKSEGMENT PARA STACKSTACKDB 50 DUP(?)STACK ENDS43CODE SEGMENTASSUMECS:CS:CODE,DS:DATA,SS:STACKBEGIN:MOV AX,DATA MOV DS,AX MOV BX,OFFSET TABLESQ MOV AH,0 MOV AL,XX ADD BX,AX MOV AL,BX MOV YY,AL MOV AH,4CH INT 21H44分支结构例 实现表达式:1 (X0)Y=0(X=0)-1(X0)其中的X是8位有符号数。程序需要有三个分支:通过比较指令CMP来分出三种情况。也可以用减法指令来比较,也可以用AND指令来建立标志。45data segmentx dw 12y dw?data endscode segment assume cs:code,ds:datasign proc far push ds mov ax,0 push ax mov ax,data mov ds,ax46 mov ax,x and ax,ax jz zero jns plus mov bx,0ffffh jmp donezero:mov bx,0 jmp doneplus:mov bx,1done:mov y,bx retsign endpcode ends end sign47也可以用比较指令来实现:MOV AL,XCMPAL,0JGEBIGERMOV AL,0FFH;X0NEXT:MOV Y,ALRET48分支结构这种分支结构的编程要注意不同分支之间的隔离。可以用JMP指令来实现这种隔离。在高级语言中,由于有IF THEN ELSE的结构,不同的分支之间的隔离会自然形成,但在汇编源程序必须要通过指令来实现分支的隔离。49例例例例 比较两个无符号数X1与X2的大小,把其中的大数存入MAX单元。DATASEGMENTSOURCE DBX1,X2;两个无符号数X1和X2MAX DB?;分配存放大数的单元DATAENDSSTACK SEGMENT STACK STACKDB 100H DUP(?)STACK ENDSCODESEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AX50MOVAL,SOURCE;X1送ALCMPAL,SOURCE+1;X1与X2比较JNCBRANCH;若X1X2,转BRANCHMOVAL,SOURCE+1;否则,X2送ALBRANCH:MOV MAX,AL;大数送MAX单元MOV AX,4C00HINT21H;CODEENDSEND START51分支结构多分支程序以下的程序可以实现256个分支的程序如果多次采用条件转移指令会使程序很长,效率低。采用通过存储器寻址的间接转移指令,可以很有效的实现这样的程序。转移的条件是BUFFER的内容,若BUFFER是字节型数据,可以有256种取值。52data segmentbuffer db 3brtab dw 0000h,3000h dw 0100h,3050h dw 0000h,3090h dw 0100h,4050hdata endscode segment assume cs:code,ds:databrch proc far push ds mov ax,0 push ax mov ax,data mov ds,ax 53 lea bx,brtab mov al,buffer dec al mov ah,0 shl ax,1 shl ax,1 add bx,ax jmp dword ptrbx retbrch endpcode ends end brch54循环结构55循环结构第一种循环的实现:MOV AX,3000HMOV DS,AXMOV SI,0100HMOV DI,0200HMOV CX,100L1:MOV AL,SIMOV DI,ALINCSIINCDILOOPL1INT20H传送100个字节从0100H到0200H56循环结构第二种循环的实现:MOV AX,3000HMOV DS,AXMOV SI,0100HMOV DI,0200HMOV CX,100INCCXL1:DECCXJZL2MOV AL,SIMOV DI,ALINCSIINCDIJMPL1L2:INT20H57循环结构第二种循环的实现:MOV AX,3000HMOV DS,AXMOV SI,0100HMOV DI,0200HMOV CX,100DECSIDECDI INC CXL1:INCSIINCDI DEC CXJZL2MOV AL,SIMOV DI,ALJMPL1L2:INT20H58例例 计算计算Y=aiDATA SEGMENTTABLE DW a1,a2,a3,a4,a5,a6,a7,a8,a9,a10 DW a11,a21,.a20 .DW a91,a92,a100 YY DW?DATA ENDS59程序一程序一MOV AX,DATA 1MOV DS,AX 2MOV AX,0 3ADD AX,TABLE 4ADD AX,TABLE+2 5 ADD AX,TABL+198 103MOV YY,AX 104其中其中ADD指令有指令有l00条条60程序二:程序二:程序一中程序一中4103条指令可用如下条指令可用如下2 8条指令替代条指令替代 MOV AX,0 1MOV BX,OFFSET TABL 2MOV CX,100 3 LOP :ADD AX,BX 4INC BX 5INC BX 6DEC CX 7JNZ LOP 8MOV YY,AX 9MOV AH,4CH 10INT 21H 11 61例例4-41 给定一串16位数,找出其中大于零、等于零和小于零的个数。DATASEGMENTBUFFDW X1,X2,X3,Xn;原始16个数据COUNT EQU$-BUFF PLUS DB?;大于零的个数ZERO DB?;等于零的个数MINUSDB?;小于零的个数DATAENDSSTACKSEGMENT STACK STACKDB100 DUP(?)STACKENDS62CODESEGMENTASSUMECS:CODE,DS:DATA,ES:DATA,SS:STACKBEGIN:MOV AX,DATAMOV DS,AXMOV CX,COUNTSHR CX,1;MOV DX,0 ;设定初值:DH及DL分别为等于、大于零的个数MOV AH,0 ;设定初值:AH为小于零的个数LEA BX,BUFF63AGAIN:CMP WORD PTR BX,0JAEPLU ;大于等于0时转PIUINCAH ;统计小于零的个数JMPNEXTPLU:JZZER ;等于0时转ZERINCDL ;统计大于零的个数JMPNEXTZER:INCDH ;统计等于零的个数NEXT:INCBX ;修改地址指针INCBXLOOP AGAINMOVPLUS,DL;保存结果MOVZERO,DHMOVMINUS,AHMOVAX,4C00HINT21HCODEENDSENDBEGIN64循环结构循环的控制可以是通过计数器来实现,有时,由于不知道循环的次数,可以通过条件来控制,类似于高级语言中的WHILE(条件)的循环。例 用牛顿迭代法求一个无符号数的整数平方根。牛顿迭代法是用来求方程f(x)=0的解:65循环结构求k的平方根就是求方程x2-k=0的根。f(x)=x2-k f(x)=2x x0为初始值。66循环结构若k=90700,取x0=400,则有:x1=(400+90700/400)/2=313 x2=(313+90700/313)/2=301 x3=(313+90700/313)/2=301迭代3次就可以有结果实际运算时,将规定一个计算的误差,即这次的结果和上次的结果的差小于一定的值,迭代就结束。67 循环结构以下程序用SI存放上次的根x(n-1),DI存放这次的根x(n),当|x(n)-x(n-1)|1时,停止迭代。68data segmentx dw 4578hroot dw 0 x0 equ 256data endsstack segment stack db 100 dup(?)stack endscode segment assume cs:code,ds:datasta proc far push ds mov ax,0 push ax mov ax,data mov ds,ax69 mov ax,x mov dx,0 mov di,x0 div di mov di,axcntu:mov si,di mov ax,x mov dx,0 div si add ax,si shr ax,1 mov di,ax70 sub ax,si je done cmp ax,1 je done cmp ax,-1 jne cntudone:mov root,di retsta endpcode ends end sta71循环程序多重循环时延程序段:MOVBL,10DELY:MOV CX,2801WAT:LOOPWAITDECBLJNZDELY72 循环程序气泡排序:将10个数由小到大排序。73循环程序74循环程序用气泡排序算法对有N个元素的序列进行排序:N个元素最多进行N-1遍排序,每一遍的排序将一个当前最小(也可以是最大)的元素,推到序列的最前端;已选出的元素不参加下一次排序,即每次排序的元素数目减少一个;设置一个标志,当一遍排序过程中没有发生元素的交换,则排序结束。75循环程序实现:使用双重循环;外循环,进行最多N-1遍排序;内循环,每遍排序中,对序列元素的比较和交换;设一个标志:BL=-1。每次外循环开始时使BL=0;在内循环的比较过程中,如果发生元素的交换,则使BL=-1;如果一次外循环后BL仍然为0,结束算法。76循环程序用SI作指针,从数组的最后一个元素开始比较,因此开始时,SI的值是数组长度减1;用CX作为内循环时的比较次数。77data segmentbuff dw 1,30,-60,125,90,-1890,67,-3844,9,50cont equ$-buffdata endsstack segment stackdb 100 dup(?)stack endscode segment assume cs:code,ds:data,ss:stack,es:datasort proc far push ds mov ax,0 push ax mov ax,data mov ds,ax mov es,ax78coti:mov bl,0;设立标志 mov cx,cont mov si,cx;从最后一个元素开始 dec si dec si;定位 shr cx,1;字数 dec cx;比较次数agan:mov ax,buffsi cmp ax,buffsi-2 jge next xchg ax,buffsi-2;交换 mov buffsi,ax mov bl,-1;交换标志next:dec si dec si loop agan cmp bl,0 jne coti ret79sort endpcode ends end sort80循环程序讨论:由于是通过数组的长度来确定数组最后一个元素的位置,因此数组元素的多少发生变化时,不影响程序的运行;随着排序的进行,内循环的比较次数应该是逐渐减少的,但程序中的CX值总是从9开始。而不是9、8、7逐渐递减。81子程序汇编语言子程序设计中需要注意两个问题:参数保护问题:在子程序的开始时,要将主程序中还要使用的参数送入堆栈保护,在返回主程序前,再从堆栈中恢复这些参数。如主程序中正在使用CX作为计数器,而子程序也要使用CX,就应该将CX入堆栈保护。当主程序的标志(FLAG)也要继续使用时,也应使用PUSHF指令将标志入堆栈保护。82子程序PUSH CXPUSH SIPUSHFPOPFPOPSIPOPCXRET83子程序另一个问题是参数的传递问题。CALL指令在使用时是不可以象宏指令那样加参数的。当主程序和子程序之间有参数需要传递时,就要另行处理。通过寄存器传递参数。最常用。用寄存器作为入口参数或出口参数。用程序存储器中的参数表传递,这个参数表紧跟在调用指令的后面。通过堆栈传递参数。84子程序用程序存储器中的参数表传递参数在主程序中将要传递的参数直接放在CALL指令的后面:CALLADDSUBNUM1DD12345678HNUM2DD5678HBUFFERDD?执行CALL指令后,将地址NUM1存入内存,作为返回地址。85子程序子程序中的相应指令如下:PUSH BPMOV BP,SPMOV BX,BP+2MOV CX,CS:BXMOV SI,CS:BX+2ADDBX,12MOV BP+2,BX86data segmentval1 dd 10h,12345678hval2 dd 20h,34567890hbuff dd?,?data endsstack segment stack db 100 dup(?)stack endscode segment assume cs:code,ds:data,es:stacksort proc far push ds mov ax,0 push ax mov ax,data mov ds,ax mov es,ax87 call add64num1 dw offset val1,seg val1num2 dw offset val2,seg val2resu dw offset buff,seg buff retsta endpadd64 proc push bp mov bp,sp pushf push ax push cx push bx push si push di88 mov bx,bp+2 lds si,dword ptr cs:bx lds dx,dword ptr cs:bx+4 lds di,dword ptr cs:bx+8 xchg dx,bx mov cx,4 clcagain:lodsw adc ax,bx stosw inc bx inc bx loop again mov bx,bp+2 add bx,0ch mov bp+2,bx89 pop di pop si pop bx pop cx pop ax popf pop bp retadd64 endpcode ends end sta90子程序通过堆栈传递参数在主程序中通过PUSH指令将要传递的参数送入堆栈。调用子程序。在子程序中取出传递的参数时要保持堆栈数据的结果不变,否则,在RET返回时可能找不到需要的返回地址(实际将是找到了错误的返回地址),使程序运行出现错误,甚至死机。因此,通过BP作为指针来取出传递的参数。91子程序在使用BP前,一般都先将BP的值先送入堆栈保护。然后根据CALL指令是远调用还是近调用,用不同的指令从堆栈中取出参数:远调用:用BP+6为地址取出第一个参数(最后一个入栈的),然后依次是BP+8,BP+10等等。近调用:用BP+4为地址取出第一个参数(最后一个入栈的),然后依次是BP+6,BP+8等等。92子程序堆栈结构:远调用 近调用93设主程序已向堆栈存入3个参数,相应的子程序:SUB1 PROC FARPUSH BPMOV BP,SPPUSH CXPUSHFMOV SI,BP+10MOV DI,BP+8MOV CX,DIMOV DI,BP+6XORAX,AXMOV DX,AXP1:ADDAX,SIJNCP2INCDXP2:ADDSI,2LOOP P1MOV DI,AXMOV DI+2,DXPOPFPOPCXPOPBPRET6SUB1 ENDP子程序完成数组元素的累加。即即ADC94子程序在子程序结束时,通过堆栈传送参数的子程序结束时,应该使用 RET n来退出子程序。其中的n是所传送参数的数目的2倍。当传送了3个参数时,应使用RET 6来返回调用程序。RET n指令的功能除了完成RET指令的功能外,还要使:SPSP+n目的是使SP回到传递参数以前的位置。保证以后的堆栈操作不因传递了参数而发生错误。95子程序如两个子程序嵌套调用:CALLSUB1;返回地址1在子程序1中:PUSHAXPUSHBXPUSHCX;传递3个参数CALLSUB2;返回地址2在子程序2中就应使用RET 6来返回。SP子程序子程序2中中96子程序如两个子程序嵌套调用:CALLSUB1;返回地址1在子程序1中:PUSHAXPUSHBXPUSHCX;传递3个参数CALLSUB2;返回地址2在子程序2中就应使用RET 6来返回。SPRET 返回返回97子程序如两个子程序嵌套调用:CALLSUB1;返回地址1在子程序1中:PUSHAXPUSHBXPUSHCX;传递3个参数CALLSUB2;返回地址2在子程序2中就应使用RET 6来返回。SPRET 6 返回返回98操作系统资源的使用功能调用01功能:从键盘输入一个字符入口参数:无出口参数:键入字符的ASCII码存AL寄存器调用:MOV AH,01INT21H99操作系统资源的使用功能调用02功能:将一个字符送显示器显示入口参数:显示字符的ASCII码存DL寄存器出口参数:无调用:MOV DL,AMOV AH,02INT21H100MOVCX,100MOVBL,0GOON:PUSHCXMOVAH,2MOVDL,0DHINT21HMOVAL,BLINCALDAAANDAL,0FHMOVBL,ALORAL,30HMOVDL,ALMOVAH,2INT21HCALLDELAYPOPCXLOOPGOON连续显示连续显示19,0共共10遍。遍。100个字个字符。符。但缺少输出但缺少输出0AH符。符。101操作系统资源的使用功能调用09功能:将一个字符串送显示器显示入口参数:显示字符串的首地址- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编语言 程序设计
咨信网温馨提示:
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【a199****6536】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【a199****6536】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【a199****6536】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【a199****6536】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。
关于本文