160 likes | 398 Views
4.1汇编语言的基本语法. Macro-name. MACRO. [ dummy Parameter List]. ּּּ. 宏定义体. 宏指令名. 形式参数 (用逗号隔开). ENDM. 宏指令. 宏( MACRO) 是源程序中一段有独立功能的程序代码、它只需在源程序中定义一次,就可以多次用一条宏指令来调用它。 宏定义是用伪指令来实现的。其格式为:. MACRO 和 ENDM 是一对伪指令,定义一条宏指令。 宏定义体—— 一组有独立功能的程序代码。. 宏指令名—— 宏指令的名字。. 形式参数—— 宏指令调用时传递给宏定义体的参数。.
E N D
4.1汇编语言的基本语法 Macro-name MACRO [dummy Parameter List] ּּּ 宏定义体 宏指令名 形式参数(用逗号隔开) ENDM • 宏指令 • 宏(MACRO)是源程序中一段有独立功能的程序代码、它只需在源程序中定义一次,就可以多次用一条宏指令来调用它。 • 宏定义是用伪指令来实现的。其格式为: MACRO和ENDM是一对伪指令,定义一条宏指令。 宏定义体——一组有独立功能的程序代码。 宏指令名——宏指令的名字。 形式参数——宏指令调用时传递给宏定义体的参数。
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
4.1汇编语言的基本语法 • 宏指令 例2 宏定义带形式参数 宏定义: FOO MACRO P1, P2 MOV AX, P1 P2 ENDM 宏调用: FOO WORD_VAR, INC AX 宏展开: + MOV AX, WORD_VAR + INC AX
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
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
第四章 汇编语言程序设计 4.2 汇编语言程序设计 • 程序设计的一般步骤 1)分析问题——问题性质、目的、已知数据、精度要求及速度要求等。选择合适的解决方法 2)确定算法——确定求解步骤和方法,输入、出数据的格式等。 3)分配存贮区——程序和数据的内存分配,存入方式。 4)绘制流程图——形象化描述程序算法。 5)根据流程图编程——简单明了,层次清晰,运算迅速。 6)调试程序。
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演示
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
4.2 汇编语言程序设计 例1 符号函数 1当X>0 (-128≤x ≤127) 0当X=0 -1当X<0 N Y 条件 Y= 程序段2 程序段1 • 分支结构程序 分支程序是利用条件转移指令,使程序执行到某一指令后,根据运算状态标志条件是否满足,来改变程序执行的次序。分支程序的结构如图所示。
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
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
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
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
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
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
课后作业: • P189 4.10 4.11 • P191 4.12 4.13 4.14