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

下载本文档

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

文档简介

宏指令及其使用宏指令、宏定义和宏调用宏指令

源程序中具有独立功能的一段程序代码宏定义

宏指令名MACRO<形式参数> … ;

… 宏体

… ;

ENDM宏调用

宏调用的格式为: 宏指令名<实际参数>例:1)PUSHREG MACRO PUSH AX PUSH BX PUSH CX PUSH DX PUSH SI PUSH DIENDM2)LOADWMACROPR,VAR MOV PR,VAR MOV AX,[PR]ENDM3)SHIFTMACRON,REG,CC MOV CL,N S&CC REG,CLENDM4)SAVEWMACROPR,REG,OPC MOV [PR],REG OPC PRENDMLOADW SI,WVARSHIFT 4,AX,ARSAVEW SI,AX,INC…将某变量指针WVAR指向的内存单元的内容送AX寄存器。右移4位后,再存入WVAR变量处。MULTIPLYMACROOPR1,OPR2,RESULT MOV AL,OPR1 IMUL OPR2 MOV RESULT,AXENDMADDMULT MACRO REG,VAR1,VAR2 MULTIPLYFIRST1,FIRST2,MULT1 MULTIPLYSECOND1,SECOND2,MULT2 MOV REG,VAR1 ADD REG,VAR2 MOV SUM,REGENDM…MULTIPLYFIRST1,FIRST2,MULT1+MOVAL,FIRST1+IMULFIRST2+MOVMULT1,AXMULTIPLYSECOND1,SECOND2,MULT2+MOV AL,SECOND1+IMUL SECOND2+MOV MULT2,AXADDMULT AX,MULT1,MULT2+MOV AX,MULT1+ADD AX,MULT2+MOV SUM,AX…宏嵌套宏调用:ADDMULT AX,MULT1,MULT2宏定义中的标号与变量

DELAY MACRO VALUE1,VALUE2 LOCAL AGAIN1,AGAIN2 PUSH AX PUSH CX MOV CX,VALUE1AGAIN1: MOV AX,VALUE2AGAIN2: DEC AX JNZ AGAIN2 LOOP AGAIN1 POP CX POP AX ENDMDELAY 6789H,0FFFFH+ PUSH AX+ PUSH CX+ MOV CX,6789H+??0000:MOV AX,OFFFFH+??0001 DEC AX+ JNZ ??0001+ LOOP ??0000+ POP CX+ POP AX …DELAY 0FFF0H,8000H+ PUSH AX+ PUSH CX+ MOV CX,0FFF0H+??0002:MOV AX,8000H+??0003:DEC AX+ JNZ ??0003+ LOOP ??0002+ POP CX+ POP AX

宏调用:…DELAY 6789H,0FFFFH…DELAY 0FFF0H,8000H…

小结宏指令与子程序的异同相同点:均可用来简化源程序,并可使程序对它们多次进行调用。不同点:定义方法及格式不同。子程序省内存,宏指令则不省。子程序执行速度慢,而宏运行速度快。4.2汇编语言程序设计

编制汇编程序步骤:明确任务,确定算法绘流程图根据流程图编写汇编语言程序上机调试程序程序的基本结构:顺序结构分支结构循环结构子程序结构编辑源程序

EDITABC.ASM汇编源程序

MASM

ABC.ASM形成目标程序ABC.OBJ连接目标程序

LINKABC.OBJ有连接错误信息?形成可执行程序ABC.EXE装入可执行程序到内存并执行ABC下一程序用DEBUG调试可执行程序DEBUG

ABC.EXE找到原因YNYNNYN有汇编错误信息?Y运行结果正确?用DEBUG调试程序查错?1.顺序程序设计

(exp6.asm)例:

TITLE EXAMPLE1 DATA SEGMENT2 VARX DW 63 VARY DW 74 RESULT DW?5 DATA ENDS6 STACK1 SEGMENTPARASTACK7 DW 20HDUP(0)8 STACK1 ENDS9 COSEG SEGMENT10 PROC1 PROC FAR11 ASSUME CS:COSEG,DS:DATA,SS:STACK112 START: PUSH DS13 MOV AX,0续:14 PUSH AX15 MOV AX,DATA16 MOV DS,AX17 MOV DX,VARX ;DX←X18 ADD DX,VARY ;DX←(X+Y)19 MOV CL,320 SAL DX,CL ;DX←(X+Y)*821 SUB DX,VARX ;DX←(X+Y)*8-X22 SAR DX,1 ;DX←((X+Y)*8-X)/223 MOV RESULT,DX ;存结果24 RET25PROC1 ENDP26COSEG ENDSEND START源程序代码段中:第15,16语句是为数据段寄存器赋值,让DS指向本程序的数据段DATA。第17~第23语句完成公式计算并存储结果是代码段中。第12~第14语句是为用户程序结束,返回DOS操作系统而作的准备。

DOS的装入功能(又称EXEC系统功能)

可执行文件.exe,应装入内存方能执行。由DOS的装入功能完成。在DOS的提示符后输入可执行文件的文件名,按回车键,DOS系统即调用装入功能,

将可执行程序装入内存。当一个用户程序的可执行文件(.EXE)装入内存后,存储器分配情况如图所示

系统占用程序段前缀用户数据段用户堆栈段用户代码…系统和ROM占用0HDS,ESSSCS0FFFFFH共100H个字节用户空间完成以下操作:确定内存可用部分,以便存放要执行的.exe文件。建立程序段前缀PSP

(ProgramSegmentPrefix)

程序段前缀大小100H,即256个字节。存放进程间的控制信息。

PSP最开始的两个字节CD20,是一条INT20H指令。装入可执行程序.exe0000:0000H可用内存空间内存FFFF:0000HROMBIOS系统检测程序COMMAND.COMDOS系统1KB中断向量表CD20………hello.exexxxx:0000Hxxxx:00FFH程序段前缀用户程序

修改以下寄存器的值

DS、ES设置为程序段前缀所在内存的段值;

(DS)=xxxxH(ES)=xxxxHSS、SP设置为由连接程序传过来的值;

CS、IP设置为程序的入口地址,即伪操作END后跟的符号名对应的物理地址;

此时CS:IP指向用户程序,开始执行用户程序。0000:0000H可用内存空间内存FFFF:0000HROMBIOS系统检测程序COMMAND.COMDOS系统1KB中断向量表CD20………hello.exexxxx:0000Hxxxx:00FFH程序段前缀CS:IP20H中断程序的功能:处理程序结束,返回系统。调用20H中断程序是有条件的:要求当前的CS应为程序段前缀在内存的段值CD20xxxx

….0000xxxx:0SS:SPSS:SP程序段前缀PSPPSP的段值PSP的偏值用户程序CSIP采用下面的程序框架,可保证执行INT20H时,当前的CS值为程序段前缀在内存的段值。codeSEGMENTASSUMECS:codemainPROCFAR;使RET为远返回start:PUSHDS;入栈保存地址

MOVAX,0;程序段前缀的首地址

PUSHAX…;程序主体部分

…RET;取程序段前缀首地址mainENDPcodeENDSENDstart注意:不可在汇编语言程序的最后用INT20H返回DOS。原因是20h中断子程的执行是有条件的。采用上述返回DOS的程序结构,才能满足该条件,否则无法返回。结束用户程序,返回操作系统的另一个办法是用中断指令“INT21H”。如使用这种办法,用户程序可以不设置过程,只要在用户程序结束时,用以下两条指令即可:

MOV AH,4CHINT 21H这样,上述程序的代码段可以修改为:

COSEG SEGMENT ASSUME CS:COSEG,DS:DATA ASSUME SS:STACK1START: MOV AX,DATA MOV DS,AX MOV DX,VARX ADD DX,VAY MOV CL,3 SAL DX,CL SUB DX,VARX SAR DX,1 MOV RESULT,DX MOV AH,4CH INT 21HCOSEG ENDS END START2.分支程序设计

分支程序结构也称条件结构,通常有两种形式,见图。两个分支YN多个分支…例:求补码数[X]补的绝对值,并送回原处。STACK SEGMENT STACK ;定义堆栈段,

DW 256DUP(?) ;预留256个单元TOP LABEL WORDSTACK ENDSDATA SEGMENTXADR DW 3456H ;设[X]补=3456HDATA ENDSCODE SEGMENTMAIN PROC FAR ASSUME CS:CODE,DS:DATA,SS:STACKSTART: MOV AX,STACK ;将堆栈段段址送SS。

MOV SS,AX MOV SP,OFFSETTOP ;设置栈指针,使其指向栈顶地址。

PUSH DS ;将PSP中INT20H指令的存放地址压入栈。

MOV AX,0 PUSH AX MOV AX,DATA ;将数据段段址送DS。

MOV DS,AX MOV AX,XADR ;取[X]补到AX。

AND AX,AX

;设置标志位。

JNS DONE

;若X≥0,转DONE。

NEG AX

;若X<0,求补得|X|。

MOV XADR,AX

;将|X|送回原处。DONE: RET ;返回PC-DOS状态。MAIN ENDPCODE ENDSEND START例:设有一组(8个)选择项存于AL寄存器中,试根据AL中哪一位为1把程序分别转移到相应的分支去。BRANCH_ADDR SEGMENT;定义数据段。BRANCH_TAB DW ROUTINE1 ;定义数据表(跳转表)。

DW ROUTINE2 DW ROUTINE3 DW ROUTINE4 DW ROUTINE5 DW ROUTINE6 DW ROUTINE7 DW ROUTINE8BRANCH_ADDR ENDS续:ROUTINE_SELECT SEGMENT ;定义代码段。MAIN PROC FAR ASSUMECS:ROUTINE_SELECT,DS:BRANCH_ADDRSTART: PUSH DS ;将PSP中INT20的存放地址压入栈顶。

SUB BX,BX PUSH BX MOV BX,BRANCH_ADDR MOV DS,BX CMP AL,0 ;判AL中是否有置1的位。

JE DONE ;若AL全零,及早退出选择结构。

LEA BX,BRANCH_TAB ;跳转表首址送BX。COUTINUE: SHR AL,l ;AL最低位移至CF。

JNC NOT_YET ;CF=0,转去检查下一位。

JMP WORDPTR[BX] ;CF=1,转相应分支程序。NOT_YET:ADDBX,TYPEBRANCH_TAB ;修改BX内容,为转入下一分支作好准备。

JMP COUTINUE ;继续检查下一选择项。DONE: RET ;若无选择项置位转此处,执行其它程序。ROUTINE1: …ROUTINE2: …… … RETMAIN ENDPROUTINE_SELECT ENDS END START3.循环程序设计

常见的循环程序结构有两种:WHILE_DO结构和DO_UNTIL结构,见图。循环初始设置循环体循环条件判断?YNYN循环初始设置循环体循环条件判断?当型循环(当条件成立进入循环)直到型循环(直到条件成立退出循环)例:将内存的二进制数转化成以压缩的BCD码形式存储的十进制数。.MODEL SMALL.386DATA SEGMENT BINNUM DD 12345678H ;内存中的二进制数。

DECINUM DB 5DUP(0) ;转化成压缩的BCD码的存储区。

NUMBER DD 1000000000,100000000,10000000,1000000 DD 100000,10000,1000,100,10,1 ;减数。DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATAMAIN PROC FARSTART: PUSH DS MOV AX,0 PUSH AX MOV AX,DATA MOV DS,AX ;初始化。

MOV EAX,BINNUM ;将数放入EAX。

MOV SI,OFFSET DECINUM ;SI指向BCD码存储区。

MOV DI,OFFSETNUMBER ;DI指向减数区。

MOV CX,5 ;循环5次。ROTATE: CALL BINDECI ;调用二进制转化成十进制子程序。

ADD DI,8 ;DI下移两个双宇。

INC SI ;SI下移一个字节。

LOOP ROTATE ;若CX≠0则循环,输出下两位。

RETMAIN ENDPBINDECI PROCNEAR PUSHF PUSH CX ;入栈。

MOV CX,0 ;CX存放商,初始清0。

CLC ;清除CF。DO_AGAIN1:

SUB EAX,DWORDPTR[DI] ;EAX减去相应的减数。

JC NEXT1 ;若不够减,则跳出循环。

INC CL ;否则,CL加l(商)。

JMP DO_AGAIN1 ;继续减。NEXT1: MOV CH,CL ;将商移入CH。

MOV CL,0 ;CL清0。

ADD EAX,DWORDPTR[DI] ;恢复最后一次减前的值。

CLC ;清除CF。DO-AGAIN2:

SUB EAX,DWORDPTR[DI+4] ;EAX减去下一个数。

JC NEXT2 ;若不够减,则跳出循环。

INC CL ;否则,CL加1(商)。

JMP DO_AGAIN2 ;继续减。NEXT2: ADD EAX,DWORDPTR[DI+4] ;恢复最后一次减前的值。 ;CH:CL中放的是高两位商,是非压缩的BCD码。 ;以下将它们转化成压缩的BCD码并放入存储单元。

SHL CH,1 SHL CH,1 SHL CH,1 SHL CH,1 ;CH左移4位。

OR CH,CL ;CH中存放压缩的BCD码。

MOV BYTEPTR[SI],CH ;放入存储区。

POP CX POPF RETBINDECI ENDPCODE ENDS END START

例:将内存中以压缩的BCD码形式存储的十进制数转化成二制数.MODEL SMALL.386DATA SEGMENT BINNUM DD0 DECINUM DB12H,34H,56H,78H,90H ;用十六进制数表示压缩的BCD码。

DATA ENDS ;十进制数是1234567890。CODE SEGMENT ASSUME CS:CODE,DS:DATAMAIN PROC FARSTART: PUSH DS MOV AX,0 PUSH AX MOV AX,DATA MOV DS,AX ;初始化

MOV EAX,0 ;32位二进制数初始值为0。

MOV SIOFFSETDECINUM ;DS:SI指向DECINUM。

MOV CX,5 ;循环5次。ROTATE: CALL DECIBIN INC SI ;SI指向下一个字节

LOOP ROTATE MOV DWORDPTRBINNUM,EAX ;将32位二进制数放入BINNUM。

RETMAIN ENDPDECIBINPROCNEAR PUSHF PUSH ECX PUSH EBXBEGIN:

MOV ECX,100 ;ECX放置乘数100。

MUL ECX ;EAX乘100 MOV CH,BYTEPTR[SI] ;取出一个压缩的BCD码到CH。

MOV CL,CH ;复制到CL。

AND CL,0FH ;CL中保留低4位。

AND CH,0F0H ;CH中保留高4位,这时CH相当于非压缩的BCD码*16。

SHR CH,1 ;算术右移1位,相当于非压缩的BCD

温馨提示

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

评论

0/150

提交评论