版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1 微机原理与测控接口技术 北京邮电大学自动化学院叶 平 Email: Y Tel: 611982092第四章第四章 汇编语言及其程序设计汇编语言及其程序设计3本章教学目标本章教学目标 一、宏汇编一、宏汇编 1. 掌握常用的伪指令:掌握常用的伪指令:DB,DW,DD,EQU,=,ORG, SEGMENT.ENDS,PROCENDP,ASSUME, MACROENDM,LOCAL,END等等 2. 如何汇编、连接生成如何汇编、连接生成 .EXE文件文件 二、程序设计二、程序设计 1. 能用汇编语言编写程序(一般约能用汇编语言编写程序(一般约40条左右)。条左右)。 2. 能熟练运用各种伪指令,包
2、括会用宏指令(宏定义中如能熟练运用各种伪指令,包括会用宏指令(宏定义中如 何用何用LOCAL定义标号)。定义标号)。 3. 能对程序改错,查错且会完善程序(程序填空)。能对程序改错,查错且会完善程序(程序填空)。 4. 编程的题型可能有程序改错、查错、完善、编程等。编程的题型可能有程序改错、查错、完善、编程等。4第一节第一节 x86系列汇编语言格式系列汇编语言格式 5l用汇编语言编写的程序,汇编源程序用汇编语言编写的程序,汇编源程序 必须翻译成必须翻译成机器码机器码表示的程序,计算机才能运行。表示的程序,计算机才能运行。l 汇编程序汇编程序是将是将汇编语言程序汇编语言程序翻译成机器语言的一种系
3、统程序翻译成机器语言的一种系统程序l汇编格式指令与机器指令一一对应汇编格式指令与机器指令一一对应用机器码编程:用机器码编程: A0 00 20 02 06 01 20 A2 02 20用汇编语言编写的程序段为:用汇编语言编写的程序段为:MOV AL , var1ADD AL , var2MOV var3 , AL汇编程序汇编程序6 例例 在内存中有一个数据块,其首地址为在内存中有一个数据块,其首地址为buffer (3000H:0200H),其中存放,其中存放16位位的的符号符号数数20个个。现要找出其中的。现要找出其中的最大值最大值,并将其存,并将其存入入MAX字单元字单元(其偏移地址为其偏
4、移地址为0228H)。 借助借助8086汇编指令,可以编写出如下程序:汇编指令,可以编写出如下程序: MOV AX,3000H MOV DS,AX MOV SI,0200H MOV CX,14H DEC CX MOV AX,SICHK: ADD SI,2 CMP SI,AX JLE NEXT MOV AX,SINEXT: LOOP CHK MOV 0228H,AX INT 20Hbuffer407 存储器分段存储器分段 code segment code ends 伪指令:伪指令:不是真正的指令代码;不是真正的指令代码;不产生机器代码;指示不产生机器代码;指示汇编程汇编程序序做何种操作,做何种
5、操作,定义代码段、定义代码段、数据段在何处。数据段在何处。code segment assume cs: codemov ax, 3000h mov ds, ax mov si, 0200h mov cx, 14h段名段名 segment 定位类型定位类型 组合类型组合类型 类类别别 段名段名 ends ( Page135 段定义语句段定义语句)dec cx mov ax, si chk: add si, 2 cmp si, ax jle next mov ax, si next: loop chk mov 0228, ax int 20h code ends8data segment dat
6、a endsstack segment stack endscode segment assume cs: code, ds: data, ss:stackmov ax, 3000h mov ds, ax mov si, 0200h mov cx, 14hdec cx mov ax, si chk: add si, 2 cmp si, ax jle next mov ax, si next: loop chk mov 0228, ax int 20h code ends1、定义、定义数据段数据段和和堆栈段堆栈段2、定义变量、定义变量变量名变量名 DB 表达式;表达式;DB、DW、DD等等9da
7、ta segment buffer dw 0, 1, -5, 10, 256, -128, -100, 45, 6 dw 3, -15, -67, 39, 4, 20, -1668,-32766 dw 32765, -525, 300 count dw 20 max dw ?data endsstack segment stack endscode segment assume cs: code, ds: data, ss:stackmov ax, 3000h mov ds, ax mov si, 0200h mov cx, 14hdec cx mov ax, si chk: add si,
8、2 cmp si, ax jle next mov ax, si next: loop chk mov 0228, ax int 20h code ends10data segment buffer dw 0, 1, -5, 10, 256, -128, -100, 45, 6 dw 3, -15, -67, 39, 4, 20, -1668,-32766 dw 32765, -525, 300 count dw 20 max dw ?data endsstack segment stack endscode segment assume cs: code, ds: data, ss:stac
9、kmov ax, data mov ds, ax lea si, buffer mov cx, countdec cx mov ax, si chk: add si, 2 cmp si, ax jle next mov ax, si next: loop chk mov max, ax int 20h code ends11data segment buffer dw 0, 1, -5, 10, 256, -128, -100, 45, 6 dw 3, -15, -67, 39, 4, 20, -1668,-32766 dw 32765, -525, 300 count dw 20 max d
10、w ?data endsstack segment db 100 dup (?)stack endscode segment assume cs: code, ds: data, ss:stackstart: mov ax, data mov ds, ax lea si, buffer mov cx, countdec cx mov ax, si chk: add si, 2 cmp si, ax jle next mov ax, si next: loop chk mov max, ax int 20h code endsend start12 指令格式指令格式 标号:标号:(前缀指令)前缀
11、指令) 助记符助记符(操作数);(注释)(操作数);(注释) 字符集字符集 符号的第一个字符必须是字母、符号的第一个字符必须是字母、“_”(下划线下划线)、“?”或或“”; 从第二个字符起,除以上字符外,还可以是数字从第二个字符起,除以上字符外,还可以是数字; 不使用汇编程序中的不使用汇编程序中的保留字保留字; (如指令的助记符等如指令的助记符等) 对定义的符号对定义的符号不区分大小写不区分大小写; x,pos100,?date,fir都是合法符号都是合法符号; 10by,cas col是非法字符。是非法字符。 操作数操作数: 常数常数、寄存器寄存器、内存操作数内存操作数、标号名标号名、过程名
12、过程名或或表达式表达式等等CHK: ADD SI,2 ; 地址加地址加2REP MOVSB ;CX-113data segment buffer dw 0, 1, -5, 10, 256, -128, -100, 45, 6 dw 3, -15, -67, 39, 4, 20, -1668,-32766 dw 32765, -525, 300 count dw 20 max dw ?data endsstack segment db 100 dup (?)stack endscode segment assume cs: code, ds: data, ss:stackstart: mov a
13、x, data mov ds, ax lea si, buffer mov cx, countdec cx mov ax, si chk: add si, 2 cmp si, ax jle next mov ax, si next: loop chk mov max, ax int 20h code endsend start;max.asm14汇编语言中的常量、变量和标号汇编语言中的常量、变量和标号1、常量、常量 常量可以是二、十、八或十六进制数,也可以是字符串。常量可以是二、十、八或十六进制数,也可以是字符串。 10100101B ;二进常数二进常数 256D 或或256 ;十进常数(;十
14、进常数(缺省缺省/默认默认) 356Q 或或356O ;八进常数八进常数 2AFH ;十六进常数十六进常数 0ABCDH ;十六进常数,但十六进常数,但十六进常数的第一个字符十六进常数的第一个字符必须是数字必须是数字。 ABCD ;字符串常数,汇编后对应为相应的字符串常数,汇编后对应为相应的ASCII码:码:41H44H 1234 ; 数字字符串常数,字符串需用数字字符串常数,字符串需用单引号单引号 ,汇编后为,汇编后为31H34H152、变量、变量 变量实际上代表着内存单元,也称变量实际上代表着内存单元,也称内存变量内存变量(内存操作数内存操作数),它必然具有段基址和段内偏移量。它必然具有段
15、基址和段内偏移量。 变量有三个属性:段基址,段内偏移量及类型(字节数)。变量有三个属性:段基址,段内偏移量及类型(字节数)。 规定:规定: 字节变量字节变量 1 字节字节 ; one DB 01h 字变量字变量 2 字节字节 ; two DW ? 双字变量双字变量 4 字节字节 ; three DD 04030201h163、标号标号 实际上是代码段中某一指令的地址,同样具有三个属性:实际上是代码段中某一指令的地址,同样具有三个属性:段基址、段内偏移量段基址、段内偏移量与与类型类型。 类型有:类型有:FAR、NEAR、SHORT FAR (段间引用)段间引用) NEAR(段内引用)段内引用)
16、注意:注意:常量、变量的名字常量、变量的名字以及以及标号标号不能用汇编语言的不能用汇编语言的保留字保留字, 即:(指令助记符,即:(指令助记符,CPU的寄存器名,伪指令的符号等)的寄存器名,伪指令的符号等) 例如:例如: AAA: MOV AX, DATA ;错误,错误,AAA不能做标号不能做标号 DAA DB ? , ? ; 错误,错误,DAA不能做变量名不能做变量名 CMP AX, BX JGE great XCHG AX, BX great: MOV max, AX17 CS:0109 80FA3ACMP DL, 3AH CS:010C 7E03JLE 0111 CS:010E 80EA
17、07SUB DL, 07 CS:0111 B104MOV CL, 04 CS:0113 D0E2SHL DL, 1 MOV DL, 04B20418 CS:0109 B204 MOV DL, 04 CS:010B 80FA3ACMP DL, 3A CS:010E 7E03JLE 0111 CS:0110 80EA07SUB DL, 07 CS:0113 B104 MOV CL, 04 CS:0115 D0E2SHL DL, 1 jLess:jLess19 4、表达式、表达式 (page 129) 由常量、标号、变量和一些由常量、标号、变量和一些操作符(运算符)操作符(运算符)构成。构成。 汇编
18、程序汇编程序对表达式进行对表达式进行运算后运算后,得到一个,得到一个确定的数值确定的数值,再,再把这个数值汇编到指令中。把这个数值汇编到指令中。 据表达式所表示的内容分为:据表达式所表示的内容分为:数字表达式数字表达式、地址表达式地址表达式。 表达式是指令的操作数;表达式是指令的操作数; 表达式中的操作符由表达式中的操作符由汇编程序汇编程序完成计算。完成计算。例例 MOV AX, 12 - - 4 ; MOV AX, 8 ; 数字表达式数字表达式 LEA BX, string + 4 ; 地址表达式地址表达式 20例例: 1. 算术运算符算术运算符 ( +、- -、*、/、MOD(%) )MO
19、V AX, 6 8 MOV AX, 48MOV AX, 100 MOD 13 MOV AX, 9 2. 逻辑运算符逻辑运算符 (AND、OR、NOT、XOR) 位操作位操作 MOV AX, 80h OR 70h MOV AX,0F0h3. 关系运算符关系运算符 ( EQ、NE、GT、GE、LT、LE ) 真:真:FFFFH; 假假: 0MOV AX, 1 GE 2 MOV AX, 0214. 分析运算符分析运算符 TYPE,LENGTH,SIZE ,OFFSET,SEG 操作数必须是内存操作数,即变量或标号操作数必须是内存操作数,即变量或标号 TYPE 格式:格式:TYPE variable
20、变量变量 或或 label 标号标号回送回送变量变量以字节数表示的类型以字节数表示的类型 (DB为为1,DW为为2,DD为为4,DQ为为8,DT为为10)回送回送标号标号类型数值(类型数值(NEAR为,为,FAR为为2) 例:例: ARRAY DW 1,2,3 ADD SI,TYPE ARRAY 经经汇编程序汇编程序后的形式:后的形式:ADD SI,2; express.asm22 LENGTH格式:格式:LENGTH variable 对于变量中使用对于变量中使用DUP,汇编回送分配给,汇编回送分配给变量单元数变量单元数,其他情,其他情况回送况回送1。例:例: FESS DD 100 DUP
21、(1) 对于对于 MOV CX,LENGTH FESS 汇编后的形式:汇编后的形式:MOV CX,100 SIZE格式:格式:SIZE variable 回送分配给该变量的回送分配给该变量的字节数字节数 LENGTH * TYPE例:例:FEES DD 100 DUP(1) MOV CX,SIZE FEES 将形成:将形成:MOV CX,40023例如例如 M1 DW 1, 2, 3 汇编后形成指令:汇编后形成指令: M2 DB ABCD MOV BL, LENGTH M1 MOV BL, 1 MOV AL, LENGTH M2 MOV AL, 1 MOV CL, SIZE M1 MOV CL
22、, 2 MOV CH, SIZE M2 MOV CH, 124OFFSET格式:格式: OFFSET variable 变量变量 或或 label 标号标号 取出取出变量变量或或标号标号所在段的偏移地址所在段的偏移地址 例例 MOV BX , OFFSET yy ; MOV BX, 100H 等价于等价于LEA BX, yySEG格式:格式: SEG variable 变量变量 或或 label 标号标号 取出取出变量变量或或标号标号所在段的段基址所在段的段基址 例例 MOV AX , SEG yy 251. TYPE变量的返回值是类型的字节数变量的返回值是类型的字节数:DB为为1,DW为为2
23、,DD为为4,DQ为为8,DT为为10;2. TYPE标号的返回值是:标号的返回值是:NEAR为为-1,FAR为为-2。3. LENGTH变量返回:变量返回: DUP分配的单元数,对于其他情况则返回分配的单元数,对于其他情况则返回1。4. SIZE返回返回值是:值是: LENGTH和和TYPE值的乘积,即变量的字节数。值的乘积,即变量的字节数。26注意注意:SEG、OFFSET只能对内存变量或标号只能对内存变量或标号MOV AX, SEG BXMOV BX, OFFSET SI275. 合成运算符合成运算符 PTR、THIS、HIGH、LOW、SHORT PTR用来给已分配的存储单元赋予新的属
24、性,以保证用来给已分配的存储单元赋予新的属性,以保证操作数的匹配。操作数的匹配。例:例:F1 DB 16H,18HF2 DW 1234H MOV AX , WORD PTR F1 ;转换成字类型与;转换成字类型与AX匹配匹配MOV BL, BYTE PTR F2 ;转换成字节类型与;转换成字节类型与BL匹配匹配28 THIS 用来规定所指用来规定所指变量变量或或标号标号的类型属性或距离属性;的类型属性或距离属性; 类型:类型:BYTE,WORD,DWORD;距离:;距离:NEAR、FAR 例例 FIRST EQU THIS BYTE ;将字节属性赋予将字节属性赋予FIRST TABLE DW
25、200 DUP(?) MOV AX, TABLE + 2 MOV TABLE,0100H MOV byte ptr TABLE, 01h MOV FIRST,01h XXXXXXXXXXXXTABLEFIRST与与PTR类似类似29 HIGH、LOW、SHORT (自学)(自学)30第二节第二节 伪指令语句伪指令语句 31 宏汇编语言中包括如下伪指令语句宏汇编语言中包括如下伪指令语句 数据定义语句数据定义语句 (Data definition ) 符号定义语句符号定义语句 (Symbol definition) 过程定义语句过程定义语句 (Procedure definition) 段定义语句
26、段定义语句 (Segmentation definition) 分组定义语句分组定义语句 (Group) 结束定义语句结束定义语句 (Termination) 主要介绍常用的基本的一些伪指令:即符号、数据、主要介绍常用的基本的一些伪指令:即符号、数据、段、过程、结束等伪指令。段、过程、结束等伪指令。321、数据定义语句、数据定义语句 格式:符号名格式:符号名 DB 表达式表达式 字节字节 表达式可以是下列情况之一:表达式可以是下列情况之一: 一个或多个字符的字符串(一个或多个字符的字符串(只限于只限于DB类型类型);); 重复子句:重复次数重复子句:重复次数 DUP (表达式)表达式) (DU
27、Plicate) ONE DB 1,2,3,4,5 ;定义了定义了5个常数个常数 TWO DB A ; 定义了一个字符定义了一个字符 THREE DB Welcome you! ; 定义了一个字符串定义了一个字符串 FOUR DB ?,?,? ; 预置两个不确定的值预置两个不确定的值 SIX DB 16 DUP (5,6,7) ;占用占用48个内存单元个内存单元33BUF DW 1122,3344,5566 ;定义了定义了3个字(个字(16位)常数位)常数 BUF1 DW 128*4 ; 定义了一个常数表达式,由汇编来运算定义了一个常数表达式,由汇编来运算 BUF2 DW 100 DUP (?
28、) 定义双字(定义双字(DD),),四个字(四个字(DQ),),10个字节(个字节(DT) DD(Define Doubleword););定义双字(定义双字(4个字节)个字节) DQ(Define Quadword ) ;定义定义4个字(个字(8个字节)个字节) DT (Define Tenbyte) ;定义定义10个字节个字节 DD、DQ、DT与与DB/DW语句类似,但不能语句类似,但不能定义字符串定义字符串。 THREE DB Welcome to Beijing! ; 定义了一个字符串定义了一个字符串34 字节变量字节变量 1 字节字节 ; array DB 01h,02h,03h,0
29、4h 字变量字变量 2 字节字节 ; array DW 0201h,0403h 双字变量双字变量 4 字节字节 ; array DD 04030201h352、符号定义语句、符号定义语句 赋值语句:赋值语句: 符号名符号名 EQU 表达式表达式 给符号定义一个值或其他符号名,甚至定义一条可执行指令给符号定义一个值或其他符号名,甚至定义一条可执行指令等。等。EQU对一个符号名对一个符号名只许定义一次只许定义一次。汇编时用语句中的表。汇编时用语句中的表达式代替程序中符号所在的地方。达式代替程序中符号所在的地方。 例如例如 COUNT EQU 20 ;把常数把常数 20 赋给赋给 COUNT BLO
30、CK EQU $-BUF ; 把把$-BUF 的值赋给的值赋给BLOCK36 B EQU 2BX P8 EQU ES:2BX CBD EQU ADD 定义符号常量,方便修改程序;定义符号常量,方便修改程序; 某表达式多次出现时,用等值操作可以方便编程;某表达式多次出现时,用等值操作可以方便编程; 汇编时不给符号常量分配内存汇编时不给符号常量分配内存。37等号语句(等号语句(=) 格式:符号名格式:符号名 = 表达式表达式 说明:此语句的功能与说明:此语句的功能与 EUQ 类似,但该语句在类似,但该语句在一个程序中可以对同一符号名一个程序中可以对同一符号名多次再定义多次再定义。 例如例如 A1
31、= 10 ; A1 定义为定义为 10 A1 = 100 ; A1重定义为重定义为100 A1 EQU 20 ; 出错,因为出错,因为A1已定义过,已定义过, ; 不能再用不能再用EQU重新定义。重新定义。 38标号定义语句(标号定义语句(LABEL) 标号名标号名 LABEL 属性(属性(NEAR/FAR) 用冒号定义标号(标号名用冒号定义标号(标号名: ),只能定义),只能定义NEAR属性属性 使用使用LABEL伪指令定义标号,可定义伪指令定义标号,可定义NEAR或或FAR属性属性 NEXT: CALL N-STEP ;定义定义NEXT为为NEAR属性的标号。属性的标号。 FIRST LA
32、BEL FAR ;定义定义FIRST为为FAR标号。其地址为该标号。其地址为该 MOV AX,CX ;语句的下一条语句的地址。语句的下一条语句的地址。393、过程定义语句、过程定义语句 (Page 139) 格式:过程名格式:过程名 PROC ( NEAR /FAR ) ;缺省值为缺省值为NEAR RET 过程名过程名 ENDP 说明:说明: 该语句的该语句的PROC与与ENDP必须成对出现,过程名前后必须一致。必须成对出现,过程名前后必须一致。 属性可以是属性可以是NEAR或或FAR,表示该过程可以被段内调用或段间调用。表示该过程可以被段内调用或段间调用。 例如例如 SUBPROG PROC
33、 FAR 主程序如下主程序如下 CODE SEGMENT RETF ASSUME CS:CODE,DS:DATA SUBPROG ENDP CALL SUBPROG CODE ENDS 404、段定义语句、段定义语句 (Page 135) 格式:段名格式:段名 SEGMENT 定位类型定位类型 组合类型组合类型 类类别别 段名段名 ENDS 说明:说明: 这两个伪操作总是一起出现。该语句将汇编语言源程这两个伪操作总是一起出现。该语句将汇编语言源程序分成段,由该语句规定哪个段是序分成段,由该语句规定哪个段是代码段代码段,哪个段是,哪个段是数据段数据段或或堆栈段堆栈段。 段名不能省略段名不能省略,
34、由,由程序员指定段名程序员指定段名,两处段名必须一,两处段名必须一致。致。 方括号中的三项是方括号中的三项是可选项可选项,是赋给段名的,是赋给段名的属性属性。各项。各项顺序不能错顺序不能错,且用,且用空格分开空格分开。41 定位类型定位类型 表示此段的表示此段的起始边界起始边界要求,可以是要求,可以是PAGE,PARA,WORD或或BYTE之一。表示如下的地址要求:之一。表示如下的地址要求: PAGE = 0000 0000 B PARA = 0000 B (默认值)默认值) WORD = 0B BYTE = B 它们分别表示以页、节、字、字节为段的地址边界,若此它们分别表示以页、节、字、字节
35、为段的地址边界,若此 项省略,则默认值为项省略,则默认值为PARA(paragraph)。)。 42 类别类别 需用单引号括起来,可以是任何合法的名称;如需用单引号括起来,可以是任何合法的名称;如STACK, DATA, CODEcode segment CODE assume cs:code,ds:data,ss:stack main proc far call read mov si, offset lista mov di, offset listb main endpcode ends 若采用若采用CodeView进行符号调试(源代码),进行符号调试(源代码), 则必须有则必须有 CO
36、DE段名段名 SEGMENT 定位类型定位类型 组合类型组合类型 类别类别 段名段名 ENDS data segment DATA lista db 55h listb db 55hdata ends43 组合类型组合类型 用来告诉连接程序(用来告诉连接程序(LINK)本段与其他段的关系。本段与其他段的关系。 NONE:本段与其他段逻辑上没有关系,每段都有自己的基:本段与其他段逻辑上没有关系,每段都有自己的基地址。(地址。(默认值默认值) PUBLIC 把本段与同名同类别的其他段连接成一个段。把本段与同名同类别的其他段连接成一个段。 COMMON 为本段和同名同类型的其他段指定相同的基址。为本
37、段和同名同类型的其他段指定相同的基址。各段会产生覆盖。各段会产生覆盖。 AT表达式表达式 把本段放在表达式的值所指定的地址上(偏移量按把本段放在表达式的值所指定的地址上(偏移量按 0 处理),处理), STACK 此段为堆栈段,此段为堆栈段,LINK要求被连接的程序至少有一个要求被连接的程序至少有一个STACK段。段。 MEMORY 把本段定位在所有其他段之上。把本段定位在所有其他段之上。44data segment DATA listax db 55h listbx db 55hdata endspublic read code segment CODE read proc far mov
38、si, offset listax mov di, offset listbx mov cx,100 ret read endpcode endsenddata segment DATA lista db 55h listb db 55hdata endsstack segment stack stack dw 6 dup(?)stack endsextrn read: farcode segment CODE assume cs:code,ds:data,ss:stack main proc far call read mov si, offset lista mov di, offset
39、listb main endpcode ends end main4_2.asm4_3.asm45data segment public DATA listax db 55h listbx db 55hdata endspublic read code segment CODE read proc far mov si, offset listax mov di, offset listbx mov cx,100 ret read endpcode endsenddata segment public DATA lista db 55h listb db 55hdata endsstack s
40、egment stack stack dw 6 dup(?)stack endsextrn read: farcode segment CODE assume cs:code,ds:data,ss:stack main proc far call read mov si, offset lista mov di, offset listb main endpcode ends end main4_2.asm4_3.asm46data segment common DATA listax db 55h listbx db 55hdata endspublic read code segment
41、CODE read proc far mov si, offset listax mov di, offset listbx mov cx,100 ret read endpcode endsenddata segment common DATA lista db 55h listb db 55hdata endsstack segment stack stack dw 6 dup(?)stack endsextrn read: farcode segment CODE assume cs:code,ds:data,ss:stack main proc far call read mov si
42、, offset lista mov di, offset listb main endpcode ends end main4_2.asm4_3.asm47段寻址语句(段寻址语句(ASSUME) 格式:格式:ASSUME 段寄存器:段名段寄存器:段名, 由于段名是任意的由于段名是任意的 ,汇编程序汇编程序并不知道哪个段名对应哪个并不知道哪个段名对应哪个 段,所以要用段,所以要用ASSUME伪指令伪指令来指明来指明段寄存器段寄存器与与段名段名之间之间 的的关系关系。 必须写在必须写在代码段代码段中,一般在中,一般在段定义语句段定义语句之后。之后。 段寄存器可以是段寄存器可以是CS,DS,SS,
43、ES 之一。之一。 ASSUME CS:CODE, DS:DATA, SS:STACK, ES:DATA 48code segment common DATA listax db 55h listbx db 55hcode endspublic read data segment CODE read proc far mov si, offset listax mov di, offset listbx mov cx,100 ret read endpdata endsendcode segment common DATA lista db 55h listb db 55hcode endss
44、tack segment stack stack dw 6 dup(?)stack endsextrn read: fardata segment CODE assume cs:data,ds:code,ss:stack main proc far call read mov si, offset lista mov di, offset listb main endpdata ends end main4_2.asm4_3.asm49 对对DS和和ES,需要使用,需要使用寄存器赋值语句寄存器赋值语句,例如:,例如:code segment assume cs: code , ds: data
45、 , es: edata , ss: stackstart: mov ax , seg data mov ds , ax mov ax , seg edata mov es , ax code ends50 对于对于SS寄存器,有两种情况。一是在程序中定义了寄存器,有两种情况。一是在程序中定义了组合类型是组合类型是STACK的段,并在的段,并在ASSUME语句中建立了语句中建立了该段与该段与SS寄存器的联系。例如:寄存器的联系。例如:stack segment stack db 256 dup (?)stack endscode segment assume cs: code , ds: da
46、ta , ss: stack code ends 在这种情况下,程序执行时,在这种情况下,程序执行时,SS会自动装入会自动装入STACK段的地址,段的地址,SP也会自动装入,因此不必用指令也会自动装入,因此不必用指令语句进行赋值。语句进行赋值。51 另一种情况,如果没有定义另一种情况,如果没有定义stack组合类型的段,就组合类型的段,就需要用与需要用与DS和和ES段同样的方式进行赋值,而且,还要段同样的方式进行赋值,而且,还要对对SP进行赋值,如:进行赋值,如:stack segment st db 256 dup (?)stack endscode segment assume cs: c
47、ode , ds: data , ss: stackstart: mov ax , seg stack mov ss , ax mov sp , size st code ends SP = 100H M12100 H SS = 1200H52定义偏移地址语句(定义偏移地址语句(ORG-origin) 格式:格式:ORG 表达式表达式 该语句指定了在它之后的程序段或数据块存放的起始地址的该语句指定了在它之后的程序段或数据块存放的起始地址的偏移量,语句中表达式的值就是起始地址,从该地址连续存偏移量,语句中表达式的值就是起始地址,从该地址连续存放程序或数据,除非遇到一个新的放程序或数据,除非遇到一
48、个新的ORG语句语句。 例如例如 DATA SEGMENT ORG 1000H BUF DB 10 DUP (20H) DATA ENDS 53地址记数器地址记数器( $ ) 用来标识用来标识汇编程序汇编程序当前的位置当前的位置 例例 在数据段定义的常量和变量如下在数据段定义的常量和变量如下 W1 DW 0B3H C4 EQU $ - W1 B1 DB ABC C0 EQU $-B1 W2 DW -4,1234H,0F4ADH,923FH C1 EQU($-W2)/2 C2 EQU ($-W2) B300414243W1B1FBFF3412F4W20000010020030040053F92$
49、AD545、分组语句、分组语句 格式:组名格式:组名 GROUP 段名段名,段名,段名, 说明:说明: 该语句又称为群伪指令。它可以该语句又称为群伪指令。它可以将若干段说明为使用同一将若干段说明为使用同一 物理段,以组名表示其段基址物理段,以组名表示其段基址。由段定义伪指令定义的各个。由段定义伪指令定义的各个 逻辑段各有不同的物理段基址。逻辑段各有不同的物理段基址。 当当段的数量较多段的数量较多时,而段寄存器只有四个,为避免进行段寄时,而段寄存器只有四个,为避免进行段寄 存器的切换,用存器的切换,用GROUP伪指令即可实现。伪指令即可实现。 组名与段名具有相同的属性,且可以直接作为段超越符使组
50、名与段名具有相同的属性,且可以直接作为段超越符使 用。段名可以是已定义的段名,也可以由用。段名可以是已定义的段名,也可以由“SEG 变量名变量名”或或 “SEG 标号标号”等表达式取代。等表达式取代。55数据段:64Kdata1data2data3data1data2data364Kdata GROUP data1,data2,data3数据段:64K数据段:64K566、结束语句、结束语句 格式:格式:END 表达式表达式 说明:说明: 该语句表示整个源程序的结束,它告诉汇编程序汇编任务该语句表示整个源程序的结束,它告诉汇编程序汇编任务到此结束。到此结束。 表达式必须是源程序的起始地址或入口
51、地址。表达式必须是源程序的起始地址或入口地址。 如果几个模块连接在一起,则只能指定如果几个模块连接在一起,则只能指定主模块主模块的起始地址。的起始地址。 其他模块不能有起始地址。其他模块不能有起始地址。 如果不使用选择项表达式,则没有起始地址传递给如果不使用选择项表达式,则没有起始地址传递给LINK。 程序就不知道从何处启动。程序就不知道从何处启动。 例如例如 END START ;START为源程序的起始为源程序的起始地址地址。57data segment DATA listax db 55h listbx db 55hdata endspublic read code segment CO
52、DE read proc far mov si, offset listax mov di, offset listbx mov cx,100 ret read endpcode endsenddata segment DATA lista db 55h listb db 55hdata endsstack segment stack stack dw 6 dup(01)stack endsextrn read: farcode segment CODE assume cs:code,ds:data,ss:stack main proc far call read mov si, offset
53、 listaa mov di, offset listb main endpcode ends end main4_2.asm4_3.asm58第三节第三节 宏汇编和宏指令宏汇编和宏指令 59code segment CODE assume cs:code,ds:data,ss:stackstart: mov cl, 3 shl bx, cl and bx, 0fh mov cl, 2 shl ax, cl and ax, 0fh code ends 名字名字 MACRO 参数,参数,参数参数, 语句(系列)语句(系列) ENDMshift macro x, y ; 定义的宏名定义的宏名shi
54、ft mov cl, x ; x,y为形式参数为形式参数 shl y, cland y, 0fh endm 60code segment CODE assume cs:code,ds:data,ss:stackstart: mov cl, 3 shl bx, cl and bx, 0fh mov cl, 2 shl ax, cl and ax, 0fh code ends code segment CODE assume cs:code,ds:data,ss:stackstart: shift 3, bx shift 2, ax code ends shift macro x, y ; 定义的
55、宏名定义的宏名shift mov cl, x ; x,y为形式参数为形式参数 shl y, cland y, 0fh endm 宏定义宏定义宏调用宏调用61code segment CODE assume cs:code,ds:data,ss:stackstart: shift 3, bx shift 2, ax code ends 宏展开宏展开shift 3, bx B1 03 1 mov cl, 3 D3 E3 1 shl bx, cl 83 E3 0F 1 and bx, 0fh shift 2, ax B1 02 1 mov cl, 2 D3 E0 1 shl ax, cl 25 00
56、0F 1 and ax, 0fh 62 实参与形参实参与形参 实参数目实参数目=形参数目,则一一对应形参数目,则一一对应 实参数目实参数目形参数目,多余的实参被忽略形参数目,多余的实参被忽略shift macro x, y ; 定义的宏名定义的宏名shift mov cl, x ; x,y为形式参数为形式参数 shl y, cland y, 0fh endm code segment CODE assume cs:code,ds:data,ss:stackstart: shift 3, bx shift 2, ax code ends 63 形参不仅可以是形参不仅可以是操作数操作数,还可以是,
57、还可以是指令。指令。 addec macro op, x mov al, x op al endm addec inc, 3 addec dec, 34H 宏定义宏定义宏调用宏调用64 宏运算符:宏运算符:&,!,!,% &: 宏替换运算符宏替换运算符 movereg macro x, y, z mov cl, y s&z x, cl endm movereg ax, 3, hl movereg ax, 3, hr mov cl, 3shl ax, clmov cl, 3shr ax, cl65 标号标号 把一个字节的十六进数转换成把一个字节的十六进数转换成ASCII码
58、放入内存中码放入内存中hex2ascii macro x cmp x, 0ah jc lp1 lp1: add x, 30h jc lp2 lp2: add x, 30h endm code segment CODE assume cs:codestart: hex2ascii bh code ends local lp1, lp2code segment CODE assume cs:codestart: hex2ascii bh hex2ascii bl code ends (Page 142)66 简化简化DOS段定义段定义 (4.3.2 page 145) 完整段定义的汇编程序完整段定
59、义的汇编程序67data segment DATA buffer dw 0, 1, -5, 10, 256, -128, -100, 45, 6 dw 3, -15, -67, 39, 4, 20, -1668,-32766 dw 32765, -525, 300 count dw 20 max dw ?data endsstack segment stack STACK db 100 dup (?)stack endscode segment CODE assume cs: code, ds: data, ss:stackstart: mov ax, data mov ds, ax lea
60、si, buffer mov cx, countdec cx mov ax, si chk: add si, 2 cmp si, ax jle next mov ax, si next: loop chk mov max, ax int 20h code endsend start68dosseg.model small .data buffer dw 0, 1, -5, 10, 256, -128, -100, 45, 6 dw 3, -15, -67, 39, 4, 20, -1668,-32766 dw 32765, -525, 300 count dw 20 max dw ?.stack 100.code
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年中职文秘(档案管理规范)试题及答案
- 2025年中职数字媒体技术应用(数字媒体操作)试题及答案
- 2025年大学酿酒工程(酿酒工程设计)试题及答案
- 2025年高职幼儿发展与健康管理(幼儿健康评估)试题及答案
- 2025年高职工业工程技术(生产流程优化)试题及答案
- 2025年中职(食品包装技术)包装设计阶段测试题及答案
- 2025年大学二年级(构造地质学)构造地质学试题及答案
- 2025年大学大三(旅游企业管理)管理策略实践测试试题及答案
- 2025年大学第四学年(工商管理)企业运营综合案例试题及答案
- 2025年高职(市场调查与分析)调查分析阶段测试题及答案
- 管理公司上墙管理制度
- DB64-266-2018 建筑工程资料管理规程
- 药店gsp考试试题及答案财务
- 工程档案归档培训课件
- 山东省菏泽市菏泽经开区2024-2025学年八年级(上)期末物理试卷(含解析)
- 高级会计师评审专业技术工作业绩报告
- 银龄计划教师总结
- 万曼呼吸机操作
- 北京市顺义区近三年(2021-2023)七年级上学期期末试卷分类汇编:单项填空
- 集装箱采购投标方案(技术方案)
- 里氏硬度计算表
评论
0/150
提交评论