1.02k likes | 1.28k Views
微机原理、汇编与接口技术. 朱定华. 2008.8. 学习要点 正确定义各种符号,熟练使用地址表达式 熟练掌握汇编语言的常用指令 掌握符号指令的寻址方式 汇编语言的格式. 第二章 汇编语言与汇编程序. 2.1. 符号指令中的表达式. 2.2. 符号指令的寻址方式. 2.3. 常用指令. 2.4. 伪指令. 2.5. 常用系统功能调用和 BIOS. 2.1 符号指令中的表达式. 以字母开头的一串字符 为了区别符号和数据,以字母开头的十六进制数,其前面要加一个前导 0. 符号. 如: 0FFH 数据 FFH 符号.
E N D
微机原理、汇编与接口技术 朱定华 2008.8
学习要点 • 正确定义各种符号,熟练使用地址表达式 • 熟练掌握汇编语言的常用指令 • 掌握符号指令的寻址方式 • 汇编语言的格式
第二章 汇编语言与汇编程序 2.1 符号指令中的表达式 2.2 符号指令的寻址方式 2.3 常用指令 2.4 伪指令 2.5 常用系统功能调用和 BIOS
2.1 符号指令中的表达式 以字母开头的一串字符 为了区别符号和数据,以字母开头的十六进制数,其前面要加一个前导0 符号 如: 0FFH 数据 FFH 符号 汇编中的各种符号由伪指令定义,有 常量、变量和标号三类
2.1.1 常量和数值表达式 常用的有二进制、十进制、十六进制和ASCII码字符 如:10,0AH,1010B, ’A’,’$’,’ABC’ 1、常量— 在汇编时已有确定数值的量 (1)数值常量 ASCII码字符做数值常量时,需加单引号
→ 程序中为经常使用的数值取的名 用EQU或“=”伪指令定义 (2)符号常量 例:AA EQU 10 CC = 66 MOV AX,AA ;AX=10 MOV AX,CC ;AX=66 注:汇编程序不给符号常量分配存储单元
2、数值表达式—由常量与运算符组成的有意义的式子,结果为数值2、数值表达式—由常量与运算符组成的有意义的式子,结果为数值 在汇编中允许对常量进行三种类型的运算: (1)算术运算包括+,-,×,/,MOD(求余) (2)逻辑运算 包括AND,OR,XOR,NOT (3)关系运算 包括:EQ(=),NE(≠),LT(<),GT(>),LE(≤),GE(≥)
2.1.2 变量和地址表达式 • 代表存储器的地址 • 变量是存储器中的数据或数据区的符号表示 • 变量名是数据的地址或数据区的首地址 • 地址表达式由变量、常量、寄存器(SI、DI、BX、BP,寄存器必须位于[ ]中)和运算符组成
(1)段地址—定义变量所在段的段首地址. 由SEG算符指定 (2)偏移地址—变量所在段的段首址到该变量的字节距离.由OFFSET算符指定 (3)类型—存取该变量中数据所需的字节数 1、存储器分段,变量和地址表达式有三重属性 如: SEG W ;取变量W的段地址 如: OFFSET W ;取变量W的偏移地址 变量的类型有:字节(byte),字(word),双字(dword),四字(qword),十字节(tbyte),一个数据分别占1,2,4,8,10个单元
——一般在数据段或附加数据段中用伪指令定义——一般在数据段或附加数据段中用伪指令定义 2、变量的定义 格式: [变量名] DB表达式[, ……] ;定义字节变量 [变量名] DW 表达式[, ……] ;定义字变量 [变量名] DD 表达式[, ……] ;定义双字变量 [变量名] DQ 表达式[, ……] ;定义四字变量 [变量名] DT 表达式[, ……] ;定义十字节变量 • 数据定义伪指令指明了变量的类型 • 表达式确定了变量的初值
(1)常量或数值表达式→存入数值 (2)ASCII字符串(若串长 ≥2,只能用DB定义) →存入ASCII码值 (3)重复子句,格式:N DUP(表达式) →重复N次(N≥1的正整数),其值由表达式确定 (4)地址表达式→可用DW或DD定义,当地址表达式为变量或标号名时,若用DW则取它的偏移地址来初始化变量;若用DD则取其偏移地址和段地址来初始化其变量 (5)由以上表达式组成的序列,之间用‘ ,’分隔 • 表达式可以有以下几种形式:
W1 DW B3 ;用B3的偏移地址初始化W1变量 B1 DB AB$;变量B1用A、B、$的ASCII码初始化 W2 DW -5,1994H B2 DB 4 DUP(?) ;变量B2的4个单元不初始化 D DD EB ;用变量EB的段地址和偏移地址初始 化D变量 B3 DB 2 DUP(-1) DB 1 DUP(10,E) ;重复因子1不能省 DB 13,1,3 在附加数据段DATA2中定义的变量如下: EB DB 8 DUP(0) EW DW AB,CD;用DW定义变量时,字符串长 度不超过2个字符 P40 例 画出数据的存储形式 9 4 1 9
1、 标号的三个属性 (1)段地址—定义该标号所在段的段首址 (2)偏移地址—标号所在段的段首址到该标号定义指令的字节距离 (3)类型—两种: NEAR—段内调用,FAR—段间调用 2.1.3标号 标号→指令地址的符号表示,也可以是过程名
(1)书写在指令助记符前,用:定义,只能为NEAR类型(1)书写在指令助记符前,用:定义,只能为NEAR类型 (2)用PROC…ENDP伪指令定义过程名 2 、标号的定义 • 例: CYCLE:MOV AL,[SI] ;定义近标 号CYCLE • 近标号只能在段内使用! 例:ABC PROC FAR;定义过程名ABC为远标号 ABC ENDP
变量、标号以及由其组成的地址表达式均有类型属性。在编程时往往需要临时改变原定义的变量或标号的类型属性,而仍保持它们原来的段地址和偏移地址属性不变变量、标号以及由其组成的地址表达式均有类型属性。在编程时往往需要临时改变原定义的变量或标号的类型属性,而仍保持它们原来的段地址和偏移地址属性不变 格式:类型 PTR 地址表达式 2.1.4 变量和标号类型的变更
例1:B1 DB ’AB$’;定义变量B1为字节类型 WORD PTR B1 ;临时改变B1的类型为字变量 例2:BYTE PTR [BX+5] ;明确地址表达式[BX+5]的类型为字节 例3:A DW 1122H,3344H ; 变量A为字类型 MOV AX, A MOV AL, BYTE PTR A
第二章 汇编语言与汇编程序 2.1 符号指令中的表达式 2.2 符号指令的寻址方式 2.3 常用指令 2.4 伪指令 2.5 常用系统功能调用和 BIOS
汇编语言的指令格式: 操作助记符 [目的操作数][源操作数];注释 一条符号指令,由操作助记符(指令助记符)以符号的形式指明该指令进行什么样的操作;操作数告之操作的对象,操作数可以放在寄存器或存储单元中;寻找操作数的方式——寻址方式 寻址方式分为三大类: 立即寻址、寄存器寻址、存储器寻址 2.2符号指令中的寻址方式
——操作数据在指定的寄存器中 传送指令助记符 目的操作数 源操作数 2.2.1寄存器寻址 AX,BX,CX,DX,SI,DI,BP,SP→16位通用寄存器 AH,AL,B,BL,CH,CL,DH,DL→8位通用寄存器 例: AX=2035H,BX=0178H MOV BX,AX ; BX=AX=2035H ADD AL,BL ; AL=ADH,BL=78H • 因为寄存器在CPU内部,所以采用寄存器寻址可提高运行效率,特别是AX,用它存放运算结果,则执行指令的时间短些,所以最常用
——操作数即为操作数据,直接放在符号指令中——操作数即为操作数据,直接放在符号指令中 2.2.2 立即寻址 例:MOV AL,5 ; 将字节05H送AL,AL=05H MOV AX,18 ;将字0012H送AX,AX=0012H MOV BL,-1 ;将字节FFH送BL,BL=0FFH • 立即寻址方式只能用于源操作数,主要用来给寄存器或存储器赋初值,也可以与寄存器或存储器操作数进行算术逻辑运算 • 例:MOV 5,AL ╳
——操作数据在存储器中,其偏移地址由指令直接给出(地址表达式中只有变量名和常量)——操作数据在存储器中,其偏移地址由指令直接给出(地址表达式中只有变量名和常量) 2.2.3 直接寻址 注: • 段地址默认在DS段 • 例:MOV AX,W • 该指令的源操作数地址为 DS:OFFSET W
直接寻址常用已定义的变量表示 例:W2 DW -5,1994H B1 DB ’AB$’ MOV AX, W2 ; AX=FFFBH MOV BX,W2+2 ; BX=1994H MOV B1+3,AL ; (B1+3)=FBH 区分立即寻址与直接寻址 从变量中取数据属于直接寻址方式,注意与符号常量区别 例:AA EQU 10 MOV AX,AA ;立即寻址,AX=000AH MOV AX,W2 ;直接寻址,AX=FFFBH
5 8 0124 1 9 0125 2.2.4 间接寻址 →操作数为带方括号的寄存器([SI],[DI],[BX],[BP]),寄存器的内容为操作数据的偏移地址 如:MOV CX,[BX] 如右图所示,若BX=0124H, 则该指令执行的操作是将 0124H作为操作数的偏移地址, 将当前数据段中0124H单元中的字 取出送CX,即CX=1958H
2.2.4 间接寻址 注: • 寄存器寻址中,寄存器内容即为操作数据; 间接寻址属于存储器寻址,寄存器内容为操作数据的偏移地址。 • 只有SI,DI,BX,BP 可用于间接寻址 例: MOV AX,[CX] ╳ • 若以SI, DI, BX 间址,约定段的段地址为DS寄存器 例:MOV AX, [BX] ;(DS:[BX])→AX • 若以BP间址,约定段的段地址为SS寄存器 例:MOV AX, [BP] ;(SS:[BP])→AL,(SS:[BP+1])→AH
2.2.5 基址寻址 →操作数据在存储器中,其偏移地址为基址寄存器BX或BP的内容与位移量之和 EA= [BX]/[BP] + 位移量 例1: MOV BL,2[BX] 或 MOV BL,[BX+2] ;(DS:[BX+2])→BL 例2: MOV 6[BP],AX 或 MOV [BP+6],AX ; AL →SS:[BP+6],AH→SS:[BP+7]
2.2.6 变址寻址 →操作数据在存储器中,其偏移地址为变址寄存器SI或DI的内容与位移量之和,与基址寻址类似 EA= [SI]/[DI] + 位移量 例:MOV AX,2[SI]或MOV AX,[SI+2] ;(DS:[SI+2]) →AL,(DS:[SI+3]) →AH
2.2.7 基址变址寻址 →操作数据在存储器中,其偏移地址为指令中指定的基址寄存器和变址寄存器的内容及位移量3项之和 EA= [BX]/[BP] + [SI]/[DI] + 位移量 例: MOV AX, 4[BX+DI]或MOV AX,[BX+DI+4] ;(DS:[BX+DI+4]) →AL ;(DS:[BX+DI+5]) →AH 段地址由基址寄存器确定: 以BX为基址寻址,操作数在DS段 以BP为基址寻址,操作数在SS段
例:W为一字变量,B为一字节变量,则: MOV AL,W[BX] ╳ MOV AL,BYTE PTR W[BX] √ MOV AX,B[SI+5] ╳ MOV AX,WORD PTR B[SI+5] √ 在符号指令中的基址,变址,基址变址三种寻址中,其位移量可以是常数或符号常量,还可以是变量名。若是变量名,它给出变量所在段的偏移地址,其意义是取变量单元中的数据,所以其类型要与另一操作数的类型一致
例:将立即数35H存入字节变量BUF+5单元中 • MOV BX, OFFSET BUF+5 • MOV BYTE PTR[BX],35H ;间接寻址 • 或:MOV BX, 5 • MOV BUF[BX],35H ;基址寻址 • 常以间址、基址、变址访问一片连续的单元 • 例:B1 DB ’AB$’ • MOV BX, OFFSET B1 ;BX=0000H • MOV AL, [BX] ;AL=41H • MOV AL, [BX+1] ;AL=42H
2.2.8 存储器寻址中段地址的确定 存储器存取方式 约定段 段更换 偏移地址 取指令 CS 不允许 IP 堆栈操作(PUSH,POP,CALL,RET等) SS 不允许 SP 数据存取(BP间址、基址除外) DS CS SS ES EA BP间址,基址数据存取 SS CS,DS,ES EA 字符串处理指令的源串 DS CS,SS,ES SI 字符串处理指令的目的串 ES 不允许 DI 1. 存储器寻址时段寄存器的基本约定和段更换见下表所示:(P46表2-1)
2. 段超越或段更换 当要否认以上默认状态,到其他段寻找操作数时,必须用跨段前缀指明操作数所在段的段寄存器名 例: MOV ES:[DI], AL ;AL → ES:[DI] MOV ES:2000H, AL ;AL → ES:2000H 其中,ES为前缀字节 • 段更换只是用来临时改变变量、标号、地址表达式的段属性,且只在所出现的语句中有效,不改变偏移地址和类型
寻址方式小结 • 寻址方式可分为三大类:立即寻址、寄存器寻址、存储器寻址。直接寻址、间接寻址、基址寻址、变址寻址、基址变址寻址都属于存储器寻址。 • 立即寻址的操作数为立即数; 寄存器寻址的操作数为寄存器; 存储器寻址的操作数为地址表达式。 • 地址表达式通式为: • [变量+寄存器+常量] • 也可表示为:变量[寄存器+常量],此种形式理解为,寄存器+常量是变量定义的数据区的位移量。
寻址方式小结 • 如果地址表达式中只出现寄存器,则一定要加‘[ ]’;如果地址表达式中没有寄存器,则可加‘[ ]’,也可不加 • 如果地址表达式中只有寄存器,则为间接寻址; 如果地址表达式中只有变量,则为直接寻址; 如果地址表达式中除有寄存器外还有变量或者 常量,则为基址寻址或变址寻址。
第二章 汇编语言与汇编程序 2.1 符号指令中的表达式 2.2 符号指令的寻址方式 2.3 常用指令 2.4 伪指令 2.5 常用系统功能调用和 BIOS
2.3 常用指令 ① 数据传送指令 ② 加减运算指令 ③ 位操作(逻辑运算)指令 注:学习时注意指令格式及功能
2.3.1 数据传送类指令 指令特点:将数据从一个部位传送到另一部位. 不影响数据的状态标志位. 1.数据传送指令 格式: MOV dest, source 目的操作数 源操作数 功能:将一个字节或一个字操作数据从源传送至目的地址中,源保持不变
MOV指令的9种形式: • MOV REG,REG • MOV REG,IMM • MOV MEM,IMM • MOV MEM,REG • MOV REG,MEM • MOV SEGREG,REG ;CS除外 • MOV REG,SEGREG • MOV SEGREG,MEM ;CS除外 • MOV MEM,SEGREG
注意: • 一个指令中,两操作数类型必须一致 • 至少1个操作数的类型要明确,不能出现二义性 • 代码段寄存器CS和立即数均不能作为目的操作数 • 源操作数和目的操作数不能同时为存储器操作数 • 存储器类型由地址表达式的变量名确定 • 立即数的类型属性不明确(字、字节…).在立即数送存储器的指令中,若存储器操作数的类型不明确,则必需使用算符来明确其中一个操作数的属性
2.数据交换指令 格式:XCHG dest,source 功能: 将源地址与目的地址中的内容互换 XCHG REG, REG XCHG REG, MEM XCHG MEM, REG
例:数据段中有两个字变量W1和W2,编写程序段将两个字变量互换例:数据段中有两个字变量W1和W2,编写程序段将两个字变量互换 W1 DW 1234H W2 DW 5678H ①用数据交换指令实现: MOV AX,W1 ;AX=1234H XCHG AX,W2 ;AX=5678H,W2=1234H MOV W1,AX ;W1=5678H ②仅用MOV指令实现: MOV AX,W1 MOV BX,W2 MOV W1, BX MOV W2 ,AX ③用堆栈操作指令: PUSH W1 PUSH W2 POP W1 POP W2
2.3.2 加减运算指令 加减运算的操作数: 注: • 两操作数需类型相同,不能同为存储器 • 加减法指令执行后的结果将影响状态标志
(1)加法指令ADD 1.加法类指令 格式:ADD dest,source 操作: source + dest →dest 即将源操作数据与目的操作数据相加,结果存入目的地址中,源地址内容不变 (2)加进位的加法指令ADC 格式:ADC dest,source 操作:dest + source + CF→dest; CF为前面指令产生的CF
例 3个32位无符号数12345678H、8765ABCDH和2468FEDCH相加,其和(仍为32位无符号数)放DX和AX中 程序段如下: MOV DX,1234H MOV AX,5678H ADD AX,0ABCDH ADC DX,8765H ADD AX,0FEDCH ADC DX,2468H
格式:INC dest 操作:dest+1→dest 例: MOV BX,1 INC BX ; BX=0002H 该指令不影响CF,对其它标志为的影响同ADD 单操作数指令,只能为REG,MEM,类型要明确,不能出现二义性 例: INC CL √ INC [SI]×→ INC BYTE PTR[SI] √ INC 2000H× 该指令常用于修改偏移地址和计数次数 (3)增量指令INC
格式:DEC dest 操作:dest-1→dest 2. 减法类指令 (1) 减法指令SUB 格式:SUB dest,source 操作:dest -source →dest (2)带借位减指令SBB 格式:SBB dest,source 操作: dest -source -CF→dest ;CF为前面指令产生的进位(借位) (3)减量指令DEC
注: • 减法类指令对标志位的影响,除将进位改为借位外,与加法类指令相同 • DEC不影响CF,其余标志均受影响 例:2个32位无符号数8765ABCDH 和2468FEDCH相减,其差送DX和AX。 程序段如下: MOV AX, 0ABCDH SUB AX, 0FEDCH ; CF=1 8765 ABCD MOV DX, 8765H -2468 FEDC SBB DX, 2468H ; CF=0 62FC ACF1
3.比较指令CMP 格式:CMP dest,source 操作: dest -source • 执行减操作,只影响标志,不改变操作数 • 主要用来判断两数的大小与是否相等 • 后面常跟条件转移指令,根据比较结果实现程序的分支
2.3.3 位操作指令 1.逻辑运算指令 (1)求补指令 格式:NEG dest 操作:将操作数地址中的内容求补后再送入操作数地址中 • 该指令是求补指令,而不是求补码指令 • 单操作数指令,操作数只能是REG,MEM • 影响标志,影响规律同减法指令
若将执行求补指令前后的数均视为补码数,则求补指令将该数变为绝对值相等符号相反的另一个数。若将执行求补指令前后的数均视为补码数,则求补指令将该数变为绝对值相等符号相反的另一个数。 例: MOV AX,0FFFBH ; AX=FFFBH NEG AX ; AX=0005H 例: MOV BX,000AH ; BX=000AH NEG BX ; BX=FFF6H
格式:NOT dest 操作:将操作数地址中的内容逐位取反后再送回操作数地址中 注: 该指令只是执行求反操作,而不是求反码指令,对符号位也求反 该指令不影响标志位 (2)求反指令NOT