接口 第3章 80x86汇编语言程序设计_第1页
接口 第3章 80x86汇编语言程序设计_第2页
接口 第3章 80x86汇编语言程序设计_第3页
接口 第3章 80x86汇编语言程序设计_第4页
接口 第3章 80x86汇编语言程序设计_第5页
已阅读5页,还剩79页未读 继续免费阅读

下载本文档

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

文档简介

1、1第3章 80 x86汇编语言程序设计(上)注:本章中,用此颜色和字型说明的文字只适用于32位汇编2有效地址(effective address EA) 操作数在段内的偏移地址寻址方式 产生有效地址的方法80 x86的操作数寻址方式有:1、立即寻址2、寄存器寻址3、存储器寻址4、端口寻址3.1 80 x86的寻址方式3.1.1 操作数寻址80 x86指令的一般汇编语言格式:标号:指令助记符目的操作数,源操作数;注释 其中 表示可选项; 31、立即寻址 操作数以常量形式直接放在指令中,紧跟在操作码之后 机器码存放形式如下:立即寻址示例 MOV AH, -40 ; -40AH MOV AX, 34

2、D8H ; 34HAH, 0D8HAL MOV AX, -40 ; 0FFD8H(-40)AX MOV EAX, 12345678H ;12345678HEAX 我们首先讨论两种与存储器无关的寻址方式:OPD8操作码8位操作数低地址高地址OP操作码D16高8位D16低8位16位操作数代码段代码段42、寄存器寻址 操作数存放在某个寄存器中,指令指定寄存器号 寄存器号操作数寄存器寻址示例 MOV AH, BL ;(BL)-AH MOV DS, AX ;(AX)-DS MOV SI, AX ;(AX)-SI MOV ECX, EDX ;(EDX)ECX说明:立即寻址和寄存器寻址方式不需再次访问存储器

3、即可得到操作数,速度快指令寄存器5有效地址(EA)的4种组成成分: 位移量(displacement) 存放在指令中的8位、16位或32位的数,是一个地址 有效地址的计算: EA=基址 +(变址*比例因子)+ 位移量 比例因子(scale factor) 其值可为1,2,4或8,386及其后继机型新增加的 变址(index) 存放在变址寄存器中的内容,用于访问数组的某个元素 基址(base) 存放在基址寄存器中的内容,用于指向数组的首地址下面我们来讨论余下的几种与存储器有关的寻址方式,先介绍几个概念:616/32位寻址时有效地址四种成分的组成四种成分16位寻址32位寻址位移量0,8,16位0,

4、 8, 32位基址寄存器BX, BP任何32位通用寄存器(包括ESP)变址寄存器SI, DI除ESP以外的32位通用寄存器比例因子 无1, 2, 4, 87 默认段选择规则访存类型所用段及寄存器缺省选择规则指令代码段 CS用于取指堆栈堆栈段 SS所有的堆栈的进栈和出栈任何用BP,ESP,EBP作为基址寄存器的访存目的串附加数据段 ES串处理指令的目的串局部数据数据段 DS除相对于堆栈以及串处理的目的串以外的所有数据访问8不允许使用段超越前缀的情况:(1)串操作指令的目的串必须用ES段(2)PUSH指令的目的和POP指令的源必须用SS段(3)程序的指令必须存放在CS段访问非默认段数据的方法段超越

5、数据的存放比较灵活,除了放在默认的DS段,还可以存放在别的段,此时访问他们需要使用段超越前缀,可用的段超越前缀有CS:, DS:, ES:, SS:, FS:, GS:。段超越举例:MOV AX, 10H ;DS段10H处的一个字的数据赋给AX寄存器MOV AX, ES:10H; ES段10H处的一个字的数据赋给AX寄存器93、直接寻址 操作数地址的偏移量(EA)在指令中物理地址=指定段的段基地址16+偏移量(EA) 系统默认,操作数在数据段段基地址EA操作数+指令存储器MOV AX, 2000H ; 立即寻址MOV AX, 2000H ; 直接寻址10直接寻址示例1 MOV AX, 1000

6、H 物理地址 设(DS)=10A0H 代码段 + OP 00H 10H 数据段 11A00H 30H 50H 50H30HAX(本章中图示存储器地址从上到下递增)低地址10A00H1000H11A00H10A0H1000H30H50H11A00H11直接寻址示例2MOV BL, ES:0100H 物理地址 设(ES)=3000H 30000H (DS)=2000H + 0100H 30100H 4B 00 BL4B在汇编语言指令中,可以用符号地址代替数值地址如:MOV AX, BUFF或 MOV AX, BUFF其中BUFF为存放数据单元的符号地址。3000H0100H30100H30100H

7、4B124、寄存器间接寻址 操作数在存储器中,操作数地址的偏移量(EA)在寄存器中基址或变址寄存器号EA操作数+存储器指令寄存器段基地址寄存器间接寻址示例 MOV AL, BX MOV AX, CS:SI MOV BP, AH MOV ECX, EDX 13MOV AH, BPMOV BX, SIMOV CX, SI设 (SS)=1000H, (DS)=2000H , (BP)=0B10H, (SI)=032AH 物理地址 物理地址 10000H 20000H + 0B10H + 032AH 40H 00H 3EH 46H40H AH10B10H2032AH463EH BX2032BH10B1

8、1H SI032AH032AHCX1000H2000H0B10H032AH10B10H10B10H2032AH2032AH40H3EH46032AH145、基址寻址 操作数的有效地址是基址寄存器的内容加上指令中指定的位移量 基址寄存器号 位移量地址+操作数指 令基址寄存器段基地址存储器EA可用于数组元素的访问15基址寻址示例 MOV AX, 3000HBX (或BX+3000H) MOV AX, COUNTBX ; COUNT是符号地址 (或 MOV AX,COUNT+BX) 若(DS)=3000H, (BX)=2000H,COUNT=4000H 30000H 2000H + 4000H 12

9、34H36000H 34H 12HAX3000H2000H4000H36000H36000H34H12166、变址寻址 1)无比例因子的变址寻址(16位寻址)变址寄存器号 位移量地址+操作数指 令变址寄存器段基地址存储器EA操作数的有效地址是变址寄存器的内容加上指令中指定的位移量17变址寻址示例 MOV CX, 6020HSI (或SI+6020H) MOV DX, COUNTSI ; COUNT是符号地址 (或 MOV AX,COUNT+SI) 若(DS)=3000H, (SI)=2000H,COUNT=1000H 30000H 2000H + 1000H 6734H33000H 34H 6

10、7HDX3000H2000H1000H33000H33000H34H6718 2)有比例因子的变址寻址 操作数的有效地址是变址寄存器的内容乘以指令中指定的比例因子及位移量之和变址寄存器 比例因子位移量下标*+操作数存储器段基地址变址寄存器变址值指 令EA19有比例因子的变址寻址示例 MOV EAX, COUNTESI*4元素012000H元素1元素2元素3+1+2+3+4+12EAX存储器EA=ESI*4COUNT设(ESI)=3,(DS)=1000HCOUNT=2000H20 7、基址变址寻址1)无位移量的基址变址寻址 操作数的有效地址是一个基址寄存器和一个变址寄存器的内容之和基址寄存器变址

11、寄存器变址值基址值+操作数指 令变址寄存器基址寄存器段基地址存储器EA21无位移量基址变址寻址示例 MOV AX, BX+DI MOV AX, BXDI 若 (DS)=2100H, (BX)=0158H, (DI)=10A5H,物理地址 21000H 0158H+ 10A5H 221FDH 34H 12H1234HAX2100H0158H10A5H221FDH221FDH34H12222)基址变址相对寻址 操作数的有效地址是一个基址寄存器的内容、一个变址寄存器的内容及位移量之和 基址寄存器变址寄存器位移量变址值基址值+操作数指 令变址寄存器基址寄存器段基地址存储器EA23基址变址相对寻址示例

12、MOV AX, MASKBX+SI;MASK是符号地址 若 (DS)=3000H, (BX)=2000H, (SI)=1000H, MASK=0250H 物理地址 30000H 2000H 1000H + 0250H 33250H 20H 43H 4320H AX3000H2000H1000H0250H33250H33250H20H43243)基址比例变址寻址 操作数的有效地址是变址寄存器的内容乘以指令中指定的比例因子加基址寄存器的内容之和基址寄存器变址寄存器比例因子下标基址值*+操作数指 令变址寄存器基址寄存器变址值段基地址存储器 EA基址比例变址寻址示例 MOV ECX, EBX+ESI*

13、8254)相对基址比例变址寻址 操作数的有效地址是变址寄存器的内容乘以指令中指定的比例因子加基址寄存器的内容、再加位移量之和基址寄存器变址寄存器比例因子位移量下标基址值*+操作数指 令变址寄存器基址寄存器变址值段基地址存储器EA相对基址比例变址寻址示例 MOV EAX, TABLEEBX+EDI*4268、端口寻址1)直接寻址(I/O Port Direct Addressing)直接寻址是使用一字节立即数寻址,因此I/O端口的寻址范围为00HFFH,最多为256个。 IN AL, 20H ;从20H端口读入1个字节OUT 60H, AX;将AX中1个字送到60H端口2)间接寻址(I/O Po

14、rt Indirect Addressing) 间接寻址由DX寄存器间接给出I/O端口地址,为两个字节,所以最多可寻址216=64K个端口地址。 MOVDX, 3FCHINAL, DX;从3FCH端口读入1个字节273.1.2 转移操作寻址直接寻址(段间)指令中直接提供了转向段地址和偏移地址,用指令中提供的偏移地址取代IP寄存器,用指令中提供的段地址取代CS寄存器的内容就完成从一个段到另一个段的转移操作。 JMP FAR PTR NEXT_PRO28相对寻址(当前段内)转向的有效地址是当前IP寄存器的内容和指令中指定的位移量之和位移量只有8位的为短(short)转移或条件转移位移量有16位的为

15、近(near)转移 偏移量机器码程序00000405PROG_S: ADD AL,05H000290 NOP0003EBFB JMP SHORT PROG_S000590 NOP29间接寻址段内间接寻址转向有效地址是一个寄存器或是两个字节存储单元的内容 。所得到的转向的有效地址用来取代IP寄存器的内容。 设:(DS)=2000H,(BX)=1000H,变量TABLE的有效地址为1000H,(21000H)=0040H,(22000H)=5678H,则下列三条指令分别执行后结果如下: JMP BX;执行后IP=1000H JMP BX ;执行后IP=0040H JMP TABLEBX ;执行后I

16、P=5678H30间接寻址段间间接寻址用存储器中的相继的四个字节的内容来取代IP和CS寄存器中的原始内容以达到段间转移的目的。 设:(DS)=2500H,(SI)=1300H,(26300H)=4500H,(26302H)=32F0H, 则执行以下指令后结果如下:JMP DWORD PTR SI;执行后CS=32F0H,IP=4500H313.2 80 x86汇编语言格式汇编语言源程序结构汇编语言上机过程汇编语言语句格式伪操作(伪指令) 数据段 说明: 堆栈段 1、各段顺序无关 2、除代码段外,可缺省 3、可有若干个数据段, 若干代码段 代码段 END 标号 附加段3.2.1 源程序结构概览3

17、2汇编语言程序例.DATA BUF1 DB 34H ;变量定义 BUF2 DB 2AH SUM DB ?.CODESTART: MOV AX, DATA MOV DS, AX ; 段寄存器赋值 MOV AL, BUF1 ADD AL, BUF2 MOV SUM, AL MOV AH, 4CH INT 21H ; 程序退出END START数据段代码段333.2.2 汇编语言程序上机过程源程序 .asm汇编masm目标程序 .obj连接linkdebug调试可执行程序 .exeDOS下执行执行调试修改34更多细节以及在VC6中实现C+中嵌入汇编请看汇编语言上机过程(自学).ppt有三类语句:指令

18、语句完成操作功能,能翻译成机器指令伪指令语句为汇编程序在翻译源程序时提供 有关信息 宏指令语句由若干条指令语句组成的语句伪指令语句格式: 符号名 伪操作 操作数,操作数, ;注释3.2.3 汇编语言语句格式35指令语句格式符号名:指令助记符目的操作数,源操作数;注释 一、指令语句格式1、符号名 由用户按一定规则定义的标识符,有标号和变量两种形式,在指令格式中用的是标号。可用符号是: 字母:A-Z, a-z 数字符: 0-9 专用字符:?, _, , $ 长度不超过31个字符, 首字符不能为数字,不能和保留字同名。2、指令助记符 指令助记符是汇编指令的符号代码,不可缺省。 汇编源程序时,系统使用

19、内部对照表将每条指令的助记符译成相应的机器码。363、目的操作数 1)参与指令操作 2)暂存操作结果 除立即寻址方式外,其他寻址方式均适用于目的操作数. 4、源操作数 提供原始数据或操作对象,面向所有寻址方式5、注释 注释在系统汇编时并不产生机器码 注释可以放在指令语句尾,也可单独使用 注释前面的“;”不可缺少 37指令举例: START: MOV AX, 2000H MOV DS, AX ;为DS寄存器赋值二、常量常量有两种:1、数值常量 二进制数 以B结尾,如01011101B 八进制数 以Q结尾,如235Q 十进制数 以D结尾或没有结尾字母,如98D或98 十六进制数 以H结尾,如5BH

20、,当最高位为AF,则在最高位前加02、字符串常量 用单引号括起来的一个或多个字符,如A、AB 字符用ASCII码形式存储常量的应用:(1)在指令语句中作立即数 MOV CX, 100 (2)在指令语句中作位移量 MOV AX, 34SI(3)在数据定义语句中作初值 X DB 12H, 34H,abcd38三、变量和标号变量用来代表数据所在存储单元的地址,在数据段、附加段和堆栈段中使用,变量与其所代表的数据用空格隔开。变量有三种属性:1、段属性变量所在段的起始地址2、偏移属性从段起始地址到定义变量的位置之间的字节数3、类型属性该变量所保留的字节数 DB 1个字节 DW 2 个字节 DD 4个字节

21、 DQ 8个字节 DT 10个字节39标号用来代表一条指令所在存储单元的地址,在代码段中使用。标号与其代表的指令间用冒号隔开。标号也有三种属性:1、段属性定义标号所在段的起始地址2、偏移属性从段起始地址到定义标号的位置之间的字节数3、类型属性表示它的转移特性 NEAR (近) 段内转移 FAR (远) 段间转移40 处理器选择伪指令 数据定义和存储器分配伪指令 表达式赋值伪指令 地址计数器与对准伪指令3.2.4 汇编伪指令41伪指令:帮助汇编程序正确翻译源程序的命令,本身不生成任何机器指令)(一)处理器选择伪指令.8086 可使用8086指令(一般不用写).286 可使用80286指令.286

22、P 可使用保护方式下的80286指令.386 可使用80386指令.386P 可使用保护方式下的80386指令.486 可使用80486指令.486P 可使用保护方式下的80486指令.586 可使用Pentium指令.586P 可使用保护方式下Pentium的指令.686 可使用Pentium Pro指令.686P 可使用保护方式下Pentium Pro的指令.MMX 可使用MMX指令.XMM 可使用SSE指令当源程序使用了286及以上的机型新增加的指令时,应该在程序开始使用相应的处理器选择伪指令。42(二)数据定义伪指令格式:变量名 定义符 操作数项表操作:为变量分配存储单元并将初值置入相

23、应单元中操作数项可为: 1、常数或表达式 2、字符串 3、?表达式 4、带DUP 的表达式定义符可为: DB 定义字节 DW 定义字(2个字节) DD定义双字(4个字节) DF定义六字节 DQ定义八字节 DT定义十字节操作数项表:操作数项, 操作数项, 操作数项43操作数是常数或表达式 X1 DB 40H ;为X1分配1个字节,初值40H X2 DW 250*250 ;为X2分配2个字节,初值62500 X3 DD 10203040H ;为X3分配4个字节,初值为10203040H X4 DQ (120+50)/10 ;为X4分配8个字节,初值17 X5 DB 10, 20, 30 ;多项定义

24、,X5被分配3个字节,初值分别为10,20,30,地址从低到高,各个值间用逗号分开44操作数为字符串 STRING1 DB HELLO STRING2 DB H, E, L, L, O 字符串用DB定义,被定义串以单引号括起来 串中可包含数字符、大小写英文字母、回车符、 换行符、 空格、?、$、下划线_等 字符串以ASCII码形式存储在存储单元中。 STRING1 H +1 E +2 L +3 L +4 O45区分 S1 DB AB 与 S2 DW AB 它们的存储情况为: S1 S2 A B B A操作数项为? ?用于预留空间,不置初值 Y1 DB 20H, ? ;定义2个字节,其中预留1个

25、字节 Y2 DW ?, ? ;预留2个字 Y3 DD ? ;预留4个字节 Y4 DQ ? ;预留8个字节 Y5 DT ? ;预留10个字节46操作数项带重复定义符DUP 格式: N DUP(操作数项表) 操作:将操作数项表内容重复定义N次 VAR1 DW 2 DUP(2, 4), 1476H VAR2 DB 2 DUP(?, 2 DUP(A, B) ) 存储情况为: VAR1 02H VAR2 ? 00H A 04H B 00H A 02H B 00H ? 04H A 00H B 76H A 14H B4748操作数运算符算术运算符逻辑运算符关系运算符数值回送运算符属性运算符运算符优先级48

26、算术运算符(单目+, 单目-, +, -, *, /, MOD) 运算符 格 式 运 算 + +表达式 取表达式正值 - -表达式 取表达式负值 + 表达式1+表达式2 求表达式1、表达式2之和 - 表达式1-表达式2 求表达式1、表达式2之差 * 表达式1*表达式2 表达式1、表达式2之积 / 表达式1/表达式2 表达式1、表达式2之商 MOD 表达式1 MOD 表达式2 取余数 说明:1、算术运算符可用于数值表达式或地址表达式2、用于地址表达式时,只有其结果有物理意义时才有效 常用的是:地址+数字常量 (结果是地址) 地址-数字常量 (结果是地址) 地址-地址 (结果是常量)算术运算符示例

27、(1) MOV AL, 20+30 ;50-AL MOV BH, 100-2 ;98-BH MOV CX, 50/2 ;25-CX MOV AL, 80 MOD 15 ;5-AL(3) 设数据定义如下: ARRAYA DW 1, 2, 3, 4, 5, 6, 7 WENDA DW ? 将数组长度(字数)存入CX: MOV CX, (WENDA-ARRAYA)/2 ; 地址-地址,结果为一常量(2) 将首地址为BLOCK的字数组的第6个字传送到DX: MOV DX, BLOCK+(6-1)*2 ; 地址+常量,结果仍为一地址值50 逻辑运算符(NOT,AND,OR,XOR) 运算符 格 式 运

28、算 NOT NOT 表达式 按位取反 AND 表达式1 AND 表达式2 按位“与”运算 OR 表达式1 OR 表达式2 按位“或”运算 XOR 表达式1 XOR 表达式2 按位“异或”运算 逻辑运算符和逻辑运算指令的区别: 逻辑运算指令 逻辑运算符出现在语句的位置 指令助记符 操作数字段操作对象 可以是寄存器或 只能是整型常数 存储器操作数何时计算 程序运行时 源程序汇编时51关系运算符(EQ,NE,LT,LE,GT,GE) 运算符 格 式 运 算 EQ 表达式1 EQ 表达式2 表达式1=表达式2为真 NE 表达式1 NE 表达式2 表达式1表达式2为真 LT 表达式1 LT 表达式2 表

29、达式1表达式2为真 LE 表达式1 LE 表达式2 表达式1表达式2为真 GE 表达式1 GE 表达式2 表达式1=表达式2为真 关系运算符的两个操作数必须都是常量或同一段内的符号地址,比较结果为逻辑值:如果关系成立,则返回0FFFFH(真);否则,返回0(假)。52逻辑运算符示例 MOV AH, NOT 0F0H ;0FHAH MOV BL, 40H OR 0B4H ;0F4HBL MOV BL, 55H XOR 48H ;1DHBL MOV CH, 50H AND 30H ;10HCH 关系运算符示例 N1 EQU 10 N2 EQU 20 . MOV BX, N1 EQ N2 ; 0 B

30、X MOV CX, N1 NE N2 ;0FFFFH CX MOV AX, N1 LT N2 ;0FFFFH AX MOV DI, N1 GE N2 ;0-DI53数值回送运算符 (SEG,OFFSET,TYPE,LENGTH,SIZE) 数值回送运算符对变量或标号进行分析,回送其地址属性值或变量特征值。(1)地址回送运算符 符号 作用对象 操 作 SEG 变量或标号 返回其所在段的段基址值OFFSET 变量或标号 返回其在段内的偏移量 54(2)符号特征回送运算符 符号 作用对象 操 作 TYPE 变量或标号 用数字表示其类型属性 LENGTH 变量 用DUP重复定义符定义的变量 ,返回分配

31、的元素个数;其他 形式,则返回1 SIZE 变量 回送LENGTH*TYPE之积 55TYPE 运算符 类型属性 运算结果变量 DB 1 DW 2 DD 4 DQ 8 DT 10标号 NEAR -1 FAR -256数值回送运算符示例 .DATA NUM1 DB 10 DUP(10) ;数据定义 NUM2 DB 10H, 20H, 50H NUM3 DW 20 DUP(0, 4 DUP(2) NUM4 DB STRING .CODE MOV CL, SIZE NUM4 ;1*1-CL MOV CH, SIZE NUM3 ;20*2-CHMOV AH, TYPE NUM3 ; 2-AHMOV B

32、H, LENGTH NUM3 ;20-BH(最外层)MOV SI, OFFSET NUM1 ;NUM1的偏移量-SIMOV DI, OFFSET NUM2 ;NUM2的偏移量-DIMOV AX, SEG NUM1MOV BX, SEG NUM2 ;NUM2与NUM1段基址值相同57 属性运算符 (PTR, SHORT)SHORT格式: JMP SHORT 标号 操作: 转移的距离属性为短,即转移范围为-128+127字节 PTR格式: 类型 PTR 表达式 操作: 对存储器寻址的表达式,类型可为BYTE,WORD,DWORD, QWORD和TBYTE; 表达式为标号时,类型可为NEAR或FAR

33、。 该运算符显式指定表达式的类型58PTR 运算符示例(1)DATA1DB 10H, 20H, 30H DATA2DW 4023H, 1A00H ;数据定义 . MOV AX, WORD PTR DATA1 ;(AX)-2010H MOV BL, BYTE PTR DATA2 ;(BL)DS74简化段定义结构 .MODEL SMALL .STACK 100H .DATA .CODE ASSUME CS:CODE,DS:DATA,SS:STACKSTART: MOV AX, DATA MOV DS, AX MOV AH, 4CH INT 21HEND START7576 3.3 系统功能调用与人

34、机界面设计1)中断指令 中断指令(INT与IRET) 属于控制转移类指令,可以执行软件中断和DOS系统功能调用77 指令 格式 操 作 中断 INT N SP-(SP)-2 (SP)+1,(SP)-(FLAGS) SP-(SP)-2 (SP)+1,(SP)-(CS) SP-(SP)-2 (SP)+1,(SP)-(IP) IP-(0000:OA) ;OA=4*N CS-(0000:OA+2)中断返回 IRET IP-(SP)+1,(SP) SP-(SP)+2 CS-(SP)+1,(SP) SP-(SP)+2 FLAGS-(SP)+1,(SP) SP-(SP)+278常用的软件中断中断号功 能中断号功 能10H视频服务中断13H软硬盘控制中断14H串行口中断15H各种IO设备中断16H键盘中断17H并行打印口中断20H返回DOS21HDOS系统功能调用23HCtrl+Break处理

温馨提示

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

评论

0/150

提交评论