1 / 16

宏指令

4.1汇编语言的基本语法. Macro-name. MACRO. [ dummy Parameter List]. ּּּ. 宏定义体. 宏指令名. 形式参数 (用逗号隔开). ENDM. 宏指令. 宏( MACRO) 是源程序中一段有独立功能的程序代码、它只需在源程序中定义一次,就可以多次用一条宏指令来调用它。 宏定义是用伪指令来实现的。其格式为:. MACRO 和 ENDM 是一对伪指令,定义一条宏指令。 宏定义体—— 一组有独立功能的程序代码。. 宏指令名—— 宏指令的名字。. 形式参数—— 宏指令调用时传递给宏定义体的参数。.

thina
Download Presentation

宏指令

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 4.1汇编语言的基本语法 Macro-name MACRO [dummy Parameter List] ּּּ 宏定义体 宏指令名 形式参数(用逗号隔开) ENDM • 宏指令 • 宏(MACRO)是源程序中一段有独立功能的程序代码、它只需在源程序中定义一次,就可以多次用一条宏指令来调用它。 • 宏定义是用伪指令来实现的。其格式为: MACRO和ENDM是一对伪指令,定义一条宏指令。 宏定义体——一组有独立功能的程序代码。 宏指令名——宏指令的名字。 形式参数——宏指令调用时传递给宏定义体的参数。

  2. 4.1汇编语言的基本语法 • 宏指令 宏调用: SAVEREG 宏展开: 将宏定义体的内容(具有独立功能的代码段)全部列出。 PUSH AX PUSH BX PUSH CX PUSH DX PUSH SI PUSH DI 例1无参数宏定义 宏定义:SAVEREG MACRO PUSH AX PUSH BX PUSH CX PUSH DX PUSH SI PUSH DI ENDM

  3. 4.1汇编语言的基本语法 • 宏指令 例2 宏定义带形式参数 宏定义: FOO MACRO P1, P2 MOV AX, P1 P2 ENDM 宏调用: FOO WORD_VAR, INC AX 宏展开: + MOV AX, WORD_VAR + INC AX

  4. 4.1汇编语言的基本语法 • 宏汇编语言的基本格式 DATA SEGMENT • 由几个段构成,一般有数据段、代码段、堆栈段或附加数据段组成,至少要有一代码段。 • 代码段第一条指令必须有汇编起始标号START。伪指令END表示从该点开始汇编直到程序结束。 … DATA ENDS EXD SEGMENT … EXD ENDS STACK1 SEGMENT … STACK1 ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA ASSUME ES:EXD,SS:STACK1 START: MOV AX,DATA MOV DS,AX MOV AX,EXD MOV ES,AX MOV AX,STACK1 MOV SS,AX … … MOV AH,4CH INT 21H CODE ENDS END START

  5. 4.1汇编语言的基本语法 XXH 31H BUF1 2003H:0000H 32H 2003H:0001H 2003H:0002H 33H 2003H:0003H 01H BUF2 02H 2003H:0004H 03H CODE SEGMENT STA: ASSUME CS:CODE,DS:DATA MOV DX,DATA MOV DS,DX MOV SI,OFFSET BUF2 MOV AX,SEG BUF2 MOV BL,X MOV AX,NUM 2003H:0005H 12H NUM(X) 2003H:0006H 00H 2003H:0007H 12H 2003H:0008H 00H 2003H:0009H 2003H:000AH 23H SI=3 0FH 2003H:000BH … AX=2003H 2003H:000CH XXH BL=12H 2003H:000DH XXH AX=0012H 例:数据段的数据如下所示,图示其存贮情况。及指令执行结果。(DS)=2003H DATA SETGMENT BUF1 DB ‘123’ BUF2 DB 1,2,3 A EQU 100H X EQU THIS BYTE NUM DW 2 DUP(12H),0F23H DATA ENDS MOV AH,4CH INT 21H CODE ENDS END STA

  6. 第四章 汇编语言程序设计 4.2 汇编语言程序设计 • 程序设计的一般步骤 1)分析问题——问题性质、目的、已知数据、精度要求及速度要求等。选择合适的解决方法 2)确定算法——确定求解步骤和方法,输入、出数据的格式等。 3)分配存贮区——程序和数据的内存分配,存入方式。 4)绘制流程图——形象化描述程序算法。 5)根据流程图编程——简单明了,层次清晰,运算迅速。 6)调试程序。

  7. 4.2 汇编语言程序设计 无分支、无循环、无转移程序。流程图的特点,表现为只有起始、终止框、说明处理框,而无判断框。 起 始 例、用字节加法,对两个16位数做加法运算。这两个数从地址3000H:0050H开绐连续存放。 DS=3000H SI=50H,DI=52H,BX=54H AL=被加数低8位 AL=低8位相加 AH=被加数高8位 AH=高8位相加 保存运算结果 终 止 • 顺序结构程序——简单程序结构 程序清单如下:在DEBUG下进行。 MOV AX,3000H MOV DS,AX MOV SI,0050H ;被加数指针 MOV DI,0052H ;加数指针 MOV BX,54H ;和的指针 MOV AL,[SI] ;取被加数低8位 ADD AL,[DI] ;低位相加 MOV AH,[SI+1] ;取被加数高8位 ADC AH,[DI+1] ;高位相加 MOV [BX],AX ;保存运算结果 INT 20H ;结束 3000:0050 DB 34H 3000:0051 DB 12H 3000:0052 DB 78H 3000:0053 DB 56H DEBUG演示

  8. 4.2 汇编语言程序设计 例、编写计算f=(V-(X*Y+Z-500))/X的程序。X、Y、Z、V均为有符号16 位二进制数。 DATA SEGMENT X DW 0100H Y DW 01ABH Z DW -2100H V DW 6200H F DW ?, ? DATA ENDS MOV F,AX ;保存商 MOV F+2,DX ;保存余数 MOV AH, 4CH INT 21H CODE ENDS END START CODE SEGMENT ASSUME CS:CODE, DS:DATA START: MOV AX,DATA MOV DS,AX MOV AX,X IMUL Y ;DX:AX=X*Y ADD AX,Z ADC DX,0 ;DX:AX=X*Y+Z SUB AX,500H SBB DX,0 ;DX:AX=( ) 此处注意进位和借位的处理方法。 MOV BX,AX MOV CX,DX ;保存中间结果 MOV AX,V CWD ;DX:AX=V SUB AX,BX SBB DX,CX ;DX:AX=((V-( )) IDIV X

  9. 4.2 汇编语言程序设计 例1 符号函数 1当X>0 (-128≤x ≤127) 0当X=0 -1当X<0 N Y 条件 Y= 程序段2 程序段1 • 分支结构程序 分支程序是利用条件转移指令,使程序执行到某一指令后,根据运算状态标志条件是否满足,来改变程序执行的次序。分支程序的结构如图所示。

  10. 4.2 汇编语言程序设计 起 始 例1 符号函数 取数 1当X>0 (-128≤x ≤127) 0当X=0 -1当X<0 X<0? Y Y= N X=0? N Y Y=FFH=-1 Y=1 Y=0 保存结果 终 止 • 分支结构程序 MOV AL,XX CMP AL,0 JGE BIGR MOV AL,0FFH ;x<0 MOV YY,AL HLT BIGR: JE EQUL MOV AL,1 MOV YY,AL ;x>0 HLT EQUL: MOV YY,AL ;X=0 HLT

  11. 4.2 汇编语言程序设计 • 分支结构程序 例2、求AX和BX中两无符号数之差的绝对值,结果放在内存200H单元中。 分析:AX和BX的数未知。两数相减求绝对值,应先解决哪一个值稍大些,然后再用大数减小数的方法,才可求得绝对值。 方法1 用比较指令完成 MOV AX,[300H] MOV BX,[302H] CMP AX,BX JA AA SUB BX,AX MOV [200H],BX INT 20H AA: SUB AX,BX MOV [200H],AX INT 20H

  12. 4.2 汇编语言程序设计 • 分支结构程序 例2、求AX和BX中两无符号数之差的绝对值,结果放在内存200H单元中。 方法2 优化上面的程序 MOV AX,[300H] MOV BX,[302H] CMP AX,BX JA AA XCHG AX,BX AA: SUB AX,BX MOV [200H],AX INT 20H 方法3 用新的算法完成 MOV AX,[300H] MOV BX,[302] SUB AX,BX JA AA NEG AX AA: MOV [200H],AX INT 20H 不同的算法程序的质量不相同,好的数学模型往往是最好的算法 DEBUG

  13. 4.2 汇编语言程序设计 BASE+0 SBR0低位 BASE+1 SBR0高位 BASE+2 SBR1低位 SBR1高位 BASE+3 SBR2低位 BASE+4 • 分支结构程序 例3、利用跳转表实现多重分支。 跳转表:内存中连续存放一系列的跳转地址、跳转指令组成一分支表。 某工厂有8种产品的加工程序R0到R7分别存放在以SBR0,SBR1,……,SBR7为首地址的内存区域中,这8个首地址的偏移量连续存放在以BASE为首地址的跳转表内,如图所示。 表地址=表基地址+偏移量。 表基地址即为跳转表的首地址,偏移量即对应的程序人口地址在表中的地址与表基地址的距离。 DATA SEGMENT BASE DW SBRO, SBR1, SBR2, SBR3 DW SBR4, SBR5, SBR6, SBR7 BN DB 3 ;工序 DATA ENDS

  14. 4.2 汇编语言程序设计 BASE+0 SBR0低位 返回DOS方法 BASE+1 SBR0高位 BASE+2 SBR1低位 SBR1高位 BASE+3 SBR2低位 BASE+4 • 分支结构程序 DATA SEGMENT BASE DW SBRO, SBR1, SBR2, SBR3 DW SBR4, SBR5, SBR6, SBR7 BN DB 3 ;工序 DATA ENDS COSEG SEGMENT ASSUME CS: COSEG, DS: DATA MAIN PROC FAR BEGIN: PUSH DS MOV AX,0 PUSH AX MOV AX, DATA MOV DS, AX MOV AL, BN MOV AH,O ADD AL, AL MOV BX, OFFSET BASE ADD BX, AX MOV AX, [ BX] JMP AX NEXT: RET MAIN ENDP SBRO: ………… JMP NEXT ……………… ……………… SBR7: ………… JMP NEXT NEXT: ……………… ……………… COSEG ENDS END BEGIN

  15. 4.2 汇编语言程序设计 返回DOS方法小结: 1、 MOV DX,DATA MOV DS,DX ……………… ……………… MOV AH,4CH INT 21H 3、 扩展名为COM的文件 ……………… ……………… INT 20H 2、 PUSH DS MOV AX,0 PUSH AX ……………… ……………… RET

  16. 课后作业: • P189 4.10 4.11 • P191 4.12 4.13 4.14

More Related