汇编语言程序设计1_第1页
汇编语言程序设计1_第2页
汇编语言程序设计1_第3页
汇编语言程序设计1_第4页
汇编语言程序设计1_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第四章 汇编语言程序设计(assembly language programming)§4.1 汇编语言(assembly language) 一概述 汇编语言:一种符号语言,它用助记符表示指令的操作码和操作数,用标号或符号代表地址、常量和变量,与机器语言几乎一一对应汇编:把汇编语言源程序翻译成机器语言目标程序的过程 汇编语言源程序 手工汇编或汇编程序 机器语言目标程序汇编程序:用来完成汇编工作的程序,有 小汇编ASM 宏汇编MASM 动态调试程序DEBUG 二汇编语言的语句 格式: 名称 指令助记符 操作数 ;注释 带方括号的项有时可没有,注释项完全可以没有每个部分用空格分开每行最

2、多可有132个字符,但最好不要超过屏宽80 语句可分成指令性语句和指示性语句(伪指令语句) 指令性语句汇编后可生成机器码 标号: 指令助记符 操作数 ;注释 指示性语句指示汇编程序处理一些工作 名称 伪指令(指示符) 操作数 ;注释 1名称(或称标识符) 给指令或存储单元地址起的名字,由字母、数字、字符组成 字母:AZ ,az 数字:09 字符:可打印 ( ) ; , : ? (非打印 空格 制表符TAB 回车 换行) (界符: , ; : ( ) ? 界符用来表示某个标志的结束) · 数字不能作名称的第一个字符,圆点 仅能作第一个字符 保留字不能作标识符 · 名称最长为3

3、1个字符 · 当名称后跟冒号,表示该名称是其后指令的标号,代表该指令的开始地址,其他指令可以用该标号作为转移地址 · 当名称不跟冒号,它可能是标号或变量名,伪指令前的名称不跟冒号 冒号隐含NEAR属性,例: 供段内调用写成 OUTPUT:OUT DX ,AL 供段间调用写成 OUTPUT OUT DX ,AL 2指令助记符 8086/8088指令,也可以是伪指令,如果指令有前缀(LOCK、REP等)则前缀和指令用空格分开 3操作数 指令执行的对象,可能有一、二个或没有 名称 指令助记符 操作数 注释 RET ;返回(无操作数) COUNT: INC CX ;CX加1(1个操

4、作数) MOV AL,BL ;AL¬BL(2个操作数) 伪指令可有多个操作数 COST DB 3,4,5,6,7,8 ;(6个操作数,用逗号分开) 操作数可以是常数、寄存器名、标号、变量、表达式, MOV AX,BP+4;(第二个操作数为表达式) 4注释 可选项,使程序易读,汇编时不作处理 注释前面要加分号,它可位于操作数之后,也可位于行首 三常量与变量 1常量,也叫常数,没有属性的纯数,汇编时已确定的值 ·数字常量为065535中的数(16位寄存器使用,伪操作可定义32位),进制加后缀说明,十进制加D(可省),二进制加B,八进制加Q,十六进制加H,若十六进制第一位为字母,

5、则前头应加0 ·字符和字符串叫串常量,是ASCII码字符串,必须加单(或双)引号 例:A,“ABC”,汇编后变成41H,414243H 2变量,用于表达数值(或串)的标识符,有三个属性 段属性(SEGMENT) 偏移地址属性(OFFSET) 类型属性(TYPE),用DB、DW、DD定义§4.2 伪指令(pseudo-instruction) 一符号定义伪指令 1等值EQU 格式:符号名 EQU 表达式 用来给符号定义一个值,程序中出现该符号就用其值代替,EQU只能定义一次 DATA EQU 1234 ;代表一个数 XYZ EQU ALPHASI ;代表一个地址 2等号 =

6、格式:符号名 = 表达式 意义与EQU一样,但程序中可重新定义符号的值 EMP = 6 ;EMP代表6 EMP =EMP + 1 ;EMP现在代表7 3解除PURGE 格式:PURGE 符号名(符号1,符号2,符号n) 用于解除所定义的符号使该符号在以后的定义中有效 例:原定义 TAB EQU 5 可用 PURGE TAB 来解除 然后可重新定义 TAB EQU 10 二数据定义伪指令 用于预置存储器或定义变量 1定义字节DB 格式:变量名称 DB 表达式 例:DATA1 DB 2,3,4,5;从DATA1单元开始存放4字节数据 2定义字DW 格式:变量名称 DW 表达式 例:TAB DW 1

7、234H;TAB单元内容为34H,TAB+1单元内容为12H 3定义双字DD 格式:变量名称 DD 表达式 每个数据二字(四字节)低位部分在低地址,高位部分在高地址 ·用DB/DW/DD定义的数每行不得超过16项,超过16项必须换行 DB/DW/DD用法 <1> SUM DB ? ;给SUM单元分配一个字节,内容未定 <2> TAB DB 20 DUP(0);给TAB开始单元分配20字节,内容为0 <3> TIME DW 100 DUP(?);给TIME开始单元分配100字,内容未定 <4> ADDR DD TABLE ;TABLE的地

8、址(双字)给ADDR100H01101H02102H03103H04104H00105H01106HA2107H13 例:DATA SEGMENT ORG 100H TABLE DB 1,2,3,4 ADDR DD TABLE DATA ENDS 假设汇编后DS=13A2H (如果ADDR用DW定义,只得偏移量) (如果TABLE是变量,ADDR得地址,是常量,ADDR得数值) <5> LETTER DB ABCDEFG;将字符串以ASCII码形式填入LETTER开始的内存 <6> HIS DB 3 DUP(WELCOME!,0DH,0AH);从HIS单元开始重复3次存

9、放WELCOME!和回车换行符 4标号LABEL 格式:标号名 LEBEL 类型 标号用于说明可执行代码在汇编语言程序中的位置,即符号地址,供调用和转移之用 标号有三个属性 段属性 偏移量属性 距离属性(即格式中的类型):NEAR(近程)和FAR(远程) NEAR:本标号为段内标号,调用本标号只提供偏移地址,段基址为当前代码段 FAR:本标号为段间标号,调用本标号提供偏移地址和段基址 一个具有NEAR属性的标号也可用标号加冒号作后缀,并排列在代码行的开头来隐含 如 AGAIN LABEL NEAR XOR AX,BUFFBX 可写成 AGAIN:XOR AX,BUFFBX 例:ROOT LAB

10、EL NEAR ;以下程序所用的ROOT标号是段内属性 COMP PROC NEAR ;以下程序所用的过程下的标号是段内属性 TIME PROC FAR ;以下程序所用的过程下的标号是段间属性 三运算符 1算术运算符 +、-、*、/、MOD即加、减、乘、除、除法取余数(如19 MOD 7=5) 操作数是数字,结果也是数字 存储器地址运算时只有加减,例TAB+2、BETA-5等 2逻辑运算符 AND、OR、XOR、NOT即与、或、异或、非 操作数是数字,结果也是数字 例:AND BX,DAT AND 0FEH 3关系算符 EQ、NE、LT、GT、LE、GE即相等、不等、小于、大于、小于等于、大于

11、等于 若关系是假结果为0,若关系是真结果为0FFFFH 例:MOV BX,PAD LT 3 则PAD的值小于3时,汇编成MOV BX,0FFFFH 否则,汇编成MOV BX,0 4分析运算符 可把存储器操作数分解成它的组成部分,如段值、段内偏移量、类型 5合成算符 由已存在的存储器生成一个段值与偏移量相同,而类型不同的新的存储器操作数 以下讨论分析算符和合成算符 1取段基址SEG 它加于一个变量或标号之前,回送段基址,例: ASSUME CS:SEG BEGIN ;令CS为BEGIN程序段段基址 MOV AX,SEG VARN ;将VARN的段基址送AX 2取偏移量OFFSET 它加于一个变量

12、或标号之前,取其偏移量,例: MOV BX,OFFSET SUM ;将SUM的段内偏移量存入BX 3取类型码TYPE 它加于一个变量或标号之前,取其类型代码 DB DW DD DQ DT NEAR FAR 1 2 4 8 10 -1 -2 例:NG1 DB A,D,3 NG2 DW 88,265 MOV AL,TYPE NG1 ;NG1定义字节,AL ¬ 1 MOV AL,TYPE NG2 ;NG2定义字,AL ¬ 2 4取长度LENGTH 它加于一个变量之前,取分配给变量的项数 例:TAB DB 150 DUP(?) ;150项,150字节 FUM DW 150 DUP(

13、?) ;150项,300字节 则,MOV CX,LENGTH TAB ;CX ¬ 150 MOV AX,LENGTH FUM ;AX ¬ 150 ·注意:LENGTH返回的存储区必须用DUP()来定义,否则返回为1 5取字节数SIZE 它加于一个变量之前,取回变量所占字节总数,有 SIZE = LENGTH * TYPE 由上例,LENGTH TAB = 150,TYPE TAB = 1 LENGTH FUM = 150,TYPE FUM = 2 可知: SIZE TAB = 150 SIZE FUM = 300 以上5个叫数值返回算符 6类型指示PTR 格式:类

14、型 PTR 地址表达式 表示PTR右边的(存储器)操作数是左边的类型,有: BYTE、WORD、DWORD、NEAR、FAR 例:INC BYTE PTR BX ;将BX指向的单元字节加1 MOV WORD PTR DI,99 ;立即数99送DI指向的字中 JMP NEAR PTR FOK ;以近程方式跳转到FOK(只取FOK偏移地址) 7指定符THIS(合成算符) 用于定义当前所指单元中的类型 格式:THIS 类型/距离 经THIS定义过的标号具有当前汇编段、偏移量和所规定的类型或距离等属性, 例:FOOB EQU THIS BYTE;下面的字类型变量FOOW在这里指定为字节型FOOB FO

15、OW DW 120 DUP(?) 定义后,对同一数据块(FOOB和FOOW有相同的段和段内偏移量)有两种类型 访问FOOB时为字节操作,访问FOOW时为字操作FOOB/FOOWFOOB+3FOOW+4 ADD AL,FOOB3 ;将数组第四字节与AL相加 MOV AX,FOOW4将数组第五六字节组成的字送AX 也可以这样来构成FOOB: FOOB EQU BYTE PTR FOOW 又例:DATAF EQU THIS FAR DATAN:MOV AX,FOO 这时 JMP DATAN为近程转移 JMP DATAF为远程转移 8段修改符 : 用于对某一地址表达式指定临时段基址,如 MOV AX,

16、ES:BX;指定ES为BX的段基址,对当前指令有效 9短程符SHORT 与NEAR、FAR功能类似,位移量一字节范围 -128+127,对应一条短转移指令 例:JMP SHORT LAB;转移到标号LAB的地址 10方括号 表示操作数(加方括号)是一个地址偏移量,不是数值 格式:表达式 或者 表达式 例:MOV BX,AX ;将AX内容送BX所指单元 MOV BX+7,AX ;将AX内容送BX+7所指单元 MOV AX,BXSI ;将BX+SI所指单元内容送AX 11取高/低字节HIGH/LOW 用来分离常量的高/低字节,对存储器操作数无效 例:DATA EQU 789AH MOV AL,HI

17、GH DATA ;AL=78H MOV AL,LOW DATA ;AL=9AH 四段定义伪指令 1SEGMENTENDS 格式:段名 SEGMENT 定位类型 联合类型 组名 段名 ENDS ·段名 ·定位类型,给出实际段地点的种类或段长度的信息 <1> PARA 段起始地址从一个节(paragraph)的边界开始 <2> BYTE 段地址可从任意绝对地址开始 <3> WORD 段地址从任意一个字的边界开始 <4> PAGE 段地址从某一页的边界开始(一页等于256字节) <5> INPAG 段长度小于一页 

18、83;联合类型,程序中各程序段的连接和定位方法 <1> PUBLIC 将段名相同的程序段(亦称模块)依此紧密连接,但彼此不相互覆盖 <2> COMMON将段名相同的程序段连接,各段都从同一地址开始 <3> AT表达式 段定位在由表达式(结果必须是常数)所指定的节的边界上 例:AT 1234H,则段地址被定位在物理地址为12340H处如果希望从12345H开始,则在SEGMENT命令的下一行写上ORG 5 AT 不能向前引用 <4>STACK 表示这个段是运行期间的堆栈段 <5>MEMORY 该段是相互连接的几个段中地址最高的段 若没有

19、说明联合类型,则本段与其他段无关,即NONE,不和别的段连接 ·组名(classname),也叫类别名,加单引号,汇编后组名相同的程序段代码集中在一起定位,形成一个统一的物理段,组名可自定,约定的有CODE(代码段)、DATA(数据段)、STACK(堆栈段)、CONST(常数)、MEMORY(存储)等 2ASSUME 段说明语句,指明所定义的段名所使用的段寄存器(告诉汇编程序在运行期间通过哪一个段寄存器寻址才能找到所要的指令和数据),本语句一般在定义的代码段中第一条出现 格式:ASSUME 段寄存器:段名 , 例: ASSUME CS:CODE,DS:DATA ; 用SEGMENTE

20、NDS定义 ASSUME CS:SEG KGF,DS:SEG BEGIN;由算符定义 ASSUME ES:NOTHING ;用关键字定义,表示不使用ES(取消ES段寄存器) (保留字NOTHING在这里作为一个段名参数,ASSUME NOTHING表示取消所有段寄存器,各个段寄存器只能在指令性语句中由MOV指令赋值) 3ORG 定点伪指令(段内定位),用以确定下一条指令(或变量)在当前段中的偏移地址 格式:ORG 表达式 表达式以65536(64K)为模计算,超过64K则取其余数 本语句前未定义过的变量不可出现在表达式中, 表达式可包含(程序计数器当前值) 如: ORG OFFSET +100

21、0 表达式必须为正值,若为负值,就会从当前段的地址高端开始 表达式最好不要写成OFFSET -1000,以免把汇编过的1000个字节覆盖掉 ORG指令不能带标识符,如START:ORG 0和SKIP ORG 100都是错的 例:CODE SEGMENT ;段起始 ORG 100H ;本程序代码从偏移地址100H开始装入 ASSUME CS:CODE ;装入代码段地址到CS中 START:IN AL,30H ;程序段 SHL AL,1 OUT 32H,AL JMP START CODE ENDS ;程序段结束 END START ;汇编结束50H0151H0052H0253H0054H5555H

22、00 例:DATA SEGMENT ORG 50H DAT DW 1,2,$+1 DATA ENDS 注意DAT不能定义为字节,否则与$不匹配 五过程定义伪指令 格式:过程名 PROC 属性 过程体 RET 过程名 ENDP ·过程名不可缺省,它和标号一样有三个属性:段属性、偏移地址属性、距离属性 ·距离属性在PROC后指定,有NEAR和FAR,如果希望过程能让别的程序调用,则必须是FAR属性 ·一个过程允许多个入口,入口处有标号,标号要说明距离属性 例:延时100ms子程序 DELAY PROC ;隐含NEAR MOV BL,10 4T DLY1: MOV CX

23、,2801 ;内循环延时10ms10T WAIT0: LOOP WAIT0 9/5T DEC BL2T JNZ DLY18/4T RET8T DELAY ENDP 六结束伪指令 ·NAME:给模块(源程序)命名 格式:NAME 模块名称 它出现在源程序的最前端 ·END:汇编结束 格式:END 标号名 它通知汇编程序本模块汇编到此结束 标号名是可选项,若选取,应指向执行本程序的起始地址 七宏指令 宏指令:在汇编语言源程序中多次重复出现的程序段,用一个名字来定义,然后当成一条指令来使用 宏汇编:源程序中的宏指令经汇编程序翻译后扩展成对应程序段的机器码 宏指令用MACROEND

24、M来定义,如: CRLF MACRO MOV DL,0DH MOV AH,02H INT 21H ENDM (CRLF作回车换行)§4.3 汇编语言程序设计(assembly language programming)一 设计要求 1程序简明、易读、易调试、易修改 2程序占用内存要少(包括程序长度及运行时所需空间) 3程序运行速度要快 二基本设计方法 1选择合适的计算方法 2绘制程序流程图 3编制程序 4上机调试 三汇编语言程序格式和基本结构 一般一个完整的汇编语言程序至少应包括以下三个程序段 DATA SEGMENT DATA 数据段 DATA ENDS STACK SEGMENT

25、 STACK 堆栈段 STACK ENDS CODE SEGMENT CODE ASSUME CS:CODE,DS:DATA,SS:STACK START:MOV AX,DATA MOV DS,AX MOV AX,STACK MOV SS,AX 代码段 CODE ENDS END START 程序的基本结构分为顺序结构、分支结构、循环结构和子程序结构 (一)顺序结构 一种简单程序,按顺序执行 例1将200H单元的低4位和高4位分别送入201H和202H单元的低4位,这二单元的高4位清0200HXX201H0202H0DATASEGMENTORG 200HBCDDB 47HDB 2 DUP(?)

26、DATAENDSSTACKSEGMENTSTADB 20 DUP(?)TOPEQU LENGTH STASTACKENDSCODESEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTART:MOV AX,DATAMOV DS,AXMOV AX,STACKMOV SS,AXMOV AX,TOPMOV SP,AXMOV BX,OFFSET BCDMOV AL,BXAND AL,0FHMOV BX+1,ALMOV AL,BXMOV CL,4ROL AL,CLAND AL,0FHMOV BX+2,ALHLTCODEENDSEND START 例2将ADDR1和ADDR2两单

27、元开始的二个16位无符号数相加,考虑到进位,将其结果存放在SUM开始的三个单元中DATASEGMNET ADDR1DW 7854HADDR2DW 9981HSUMDB 3 DUP(0)DATAENDSSATCKSEGMENTSTADB 20 DUP(?)TOPEQU LENGTH STASTACKENDSCODESEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTART:MOV AX,DATAMOV DS,AXMOV AX,STACKMOV SS,AXMOV AX,TOPMOV SP,AXMOV AX,ADDR1ADD AX,ADDR2MOV WORD PTR SU

28、M,AXADC SUM+2,0HLTCODEENDSEDN START 例3查表将DATA1单元中字节类型数据(00FH)转换成ASCII码,并存入ASCII单元中DATASEGMENTASCTABDB 30H,31H,32H,33H,34H,35H,36H,37HDB 38H,39H,41H,42H,43H,44H,45H,46HDATA1DB 09HASCIIDB ?DATAENDSSTACKSEGMENT STACKDW10 DUP(?)STACKENDSCODESEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTARTPROC FARASCTAB300311

29、39941A42B46FASCIIPUSH DSMOV AX,0PUSH AXMOV AX,DATAMOV DS,AXMOV BX,OFFSET ASCTABMOV AL,DATA1XLATMOV ASCII,ALRETSTARTENDPCODEENDSEND START 例4将200H和201H单元字节的高4位对调,低4位不变200H201HCODESEGMENTORG 200HDATA1DB 0F3H,47HASSUME CS:CODE,DS:CODESTART:MOV AX,CODEMOV DS,AXMOV CL,4MOV AX,WORD PTR DATA1;AX=47F3HROL AX

30、,CL;AX=7F34HROL AH,CL;AX=F734HROL AL,CL;AX=F743HMOV WORD PTR DATA1,AXHLTCODEENDSEND START (二)分支结构 通过判断产生分支,借助于条件转移指令跳转到相应的分支地址执行分支程序 分支程序由三部分组成 测试部分,负责产生决定分支的条件 定向部分,根据测试条件是否满足,决定程序是否分支 标注部分,标明分支的去向 利用跳转表也可使程序转移到分支地址 例116位二进制补码X在DATA1单元,求其绝对值送DATA2单元(设X8000H) X= X, X0 -X, X<0DATASEGMENTDATA1DW 9F

31、87HDATA2DW ?DATAENDSSTACKSEGMENTSTA DB 20 DUP(?)TOPEQU LENGTH STASTACKENDSCODESEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTART:MOV AX,DATAMOV DS,AXMOV AX,STACKMOV SS,AXMOV AX,TOPMOV SP,AXMOV AX,DATA1AND AX,AXJNS ABS0NEG AXABS0:MOV DATA2,AXHLTCODEENDSEND START 例2多重分支 学生成绩按分数段划分为:A、90100(5AH64H) B、8089 (50

32、H59H) C、7079 (46H4FH) D、6069 (3CH45H) E、 <60 ( <3CH) 已知分数存放在MARK单元,请用ASCII码的A、B、C、D、E去代表MARK单元中的分数所属的段,并存于GRADE单元DATASEGMENTMARKDB 81GRADEDB ?DATAENDSCODESEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AXMOV BX,OFFSET MARKMOV AL,BXCMP AL,3CHJC LPECMP AL,46HJC LPDCMP AL,50HJC LPCCMP AL,5AH

33、JC LPBMOV AL,41H ;AJMP SHORT DONELPB:MOV AL,42H ;BJMP SHORT DONELPC:MOV AL,43H ;CJMP SHORT DONELPD:MOV AL,44H ;DJMP SHORT DONELPE:MOV AL,45H ;EDONE:MOV BX,OFFSET GRADEMOV BX,ALHLTCODEENDSEND START法2:直接查表转换(顺序结构)DATASEGMENTTABDB EEEEEEDCBAAMARKDB 81GRADEDB ?DATAENDSCODESEGMENTASSUME CS:CODE,DS:DATAST

34、ART:MOV AX,DATAMOV DS,AXMOV BX,OFFSET TABMOV AL,MARKMOV AH,0MOV CL,10DIV CLXLATMOV GRADE,ALHLTCODEENDSEND START (三)循环结构 使机器重复执行一系列指令,是一种闭合的分支结构 循环程序由四部分组成 初始化部分(或预置部分),负责设置循环初值 处理部分,循环过程的主体 控制部分,修改初值,判断是否循环 循环次数由一计数器控制 循环次数由某一指定条件是否满足来决定 结束部分,处理循环程序的最后结果 例1将DTAB单元开始的一组字节补码数(255个)求平均值,结果存入AVE单元,若结果为负

35、,在SYM置FFH否则置0DATASEGMENT DTABDB 0FDH,0FCH,05H,0F8H,DB 08H,25H,83H,97H,COUNTEQU $-DTABAVEDB ?SYMDB ?DATAENDSSTACKSEGMENT STACKSTADB 20 DUP(?)STACKENDSCODESEGMENTASSUME CS:CODE,DS:DATA,SS:STACKAVERPROCFARSTART:PUSH DSMOV AX,0PUSH AXMOV AX,DATAMOV DS,AXLEA BX,DTABMOV CX,COUNTXOR DX,DXNEXT:MOV AL,BXCBWA

36、DD DX,AXINC BXLOOP NEXTMOV AX,DXMOV CL,COUNTIDIV CLMOV AVE,ALMOV SYM,0AND AL,ALJNS DONEMOV SYM,0FFHDONE:RETAVERENDPCODEENDSEND START 循环控制方法:循环次数由计数器控制 例2将8位二进制小数规格化 设需规格化的小数在DATA1单元,要求规格化后使其最高位为1,并存入DATA2单元,办法是把小数左移至最高为位为1为止,左移次数存入DATA3单元,若小数是0,则在DATA2和DATA3单元存入0 示例:DATA1 DATA2 DATA3 22H 88H 02H 01H

37、 80H 07H CBH CBH 00H 00H 00H 00HDATASEGMENTDATA1DB 22HDATA2DB ?DATA3DB ?DATAENDSSTACKSEGMENTSTADB 20 DUP(?)TOPEQU LENGTH STASTACKENDSCODESEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTART:MOV DATAMOV DS,AXMOV AX,STACKMOV SS,AXMOV AX,TOPMOV SP,AXMOV CL,0MOV AL,DATA1 ;取数AND AL,AL ;设ZF、SF标志JZ DONECHKSF:JS DON

38、EINC CLADD AL,AL ;左移一位JMP SHORT CHKSFDONE:MOV DATA2,ALMOV DATA3,CLHLTCODEENDSEND START 循环控制方法:循环次数由某一指定条件是否满足来决定 例3多重循环 将n个无符号字节数从小到大排序,方法是依此比较相邻两单元的数,若前小后大不交换 第一轮比较n-1次,最大数沉底(高地址) 第二轮比较n-2次,次大数沉到最大数上面 第n-1轮比较完 若在某一轮比较时没有出现交换,说明顺序已排好,不必后续比较,故设交换标志 AH=1代表不交换,AH=2代表有交换DATASEGMENTLISTDB 18,6,11,3,1,2,3

39、,9,8,7,6DB 111,110,99,112,115,114,113,98,96,97COUNTEQU $-LISTDATAENDSSTACKSEGMENT STACKSTADW 10 DUP(?)STACKENDSCODESEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSETPROCFARSTART:PUSH DSMOV AX,0PUSH AXMOV AX,DATAMOV DS,AXMOV DX,COUNT-1 ;n-1轮(外循环)EXGO:MOV CX,DX ;每轮次数(内循环)MOV AH,01H ;交换标志MOV BX,OFFSET LIST ;数据块

40、首址INGO:MOV AL,BXINC BXCMP AL,BXJC NEXT ;数1小,不交换XCHG AL,BX ;数1>数2,交换DEC BXXCHG AL,BXINC BX ;恢复数据指针MOV AH,02H ;有交换标志NEXT:LOOP INGODEC DXJZ DONEDEC AHJNZ EXGODONE:RETSETENDPCODEENDSEND START (四)子程序结构 基本要求: 子程序的开始(入口处)应给予一个标号,结束处有返回指令 通用子程序要说明入口条件(入口参数)和出口条件(出口参数) 调用子程序要注意保护现场和恢复现场 调用返回的堆栈操作: CALL target ;段内SP¬SP-2,SP+1,SP ¬IP,IP¬IP+disp 段间SP¬SP-2,SP+1,SP ¬CS,CS¬seg SP¬SP-2,SP+1,SP ¬IP,IP¬offset RET ;段内IP¬ SP+1,SP,SP¬SP+2 ;段间IP¬ SP+1,SP,SP¬SP+2 CS¬ SP+1,SP,SP¬SP+2 RET n ;如上操作后SP¬SP+n ·子程序入口标号应说明距离属性 ·对

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论