ImageVerifierCode 换一换
格式:DOCX , 页数:22 ,大小:33.18KB ,
资源ID:25182016      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/25182016.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(汇编语言手册.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

汇编语言手册.docx

1、汇编语言手册寄存器与存储器1. 寄存器功能. 寄存器的一般用途和专用用途. CS:IP 控制程序执行流程. SS:SP 提供堆栈栈顶单元地址. DS:BX(SI,DI) 提供数据段内单元地址. SS:BP 提供堆栈内单元地址. ES:BX(SI,DI) 提供附加段内单元地址. AX,CX,BX 和 CX 寄存器多用于运算和暂存中间计算结果,但又专用于某些指令(查阅 指令表)。 . PSW 程序状态字寄存器只能通过专用指令(LAHF, SAHF)和堆栈(PUSHF,POPF)进行存取。2. 存储器分段管理. 解决了 16 位寄存器构成 20 位地址的问题. 便于程序重定位. 20 位物理地址=段

2、地址 * 16 + 偏移地址. 程序分段组织: 一般由代码段,堆栈段,数据段和附加段组成,不设置堆栈段时 则使用系统 内部的堆栈。3. 堆栈. 堆栈是一种先进后出的数据结构 , 数据的存取在栈顶进行 , 数据入栈使堆栈向地址减小 的方向扩展。. 堆栈常用于保存子程序调用和中断响应时的断点以及暂存数据或中间计算结果 。.堆栈总是以字为单位存取指令系统与寻址方式1. 指令系统. 计算机提供给用户使用的机器指令集称为指令系统,大多数指令为双操作数指令。执行指 令后,一般源操作数不变,目的操作数被计算结果替代。. 机器指令由 CPU 执行,完成某种运算或操作,8086/8088 指令系统中的指令分为

3、6 类: 数据 传送,算术运算,逻辑运算,串操作,控制转移和处理机控制。2. 寻址方式. 寻址方式确定执行指令时获得操作数地址的方法. 分为与数据有关的寻址方式(7 种)和与转移地址有关的寻址方式(4)种。. 与数据有关的寻址方式的一般用途:(1) 立即数寻址方式-将常量赋给寄存器或存储单元(2) 直接寻址方式-存取单个变量(3) 寄存器寻址方式-访问寄存器的速度快于访问存储单元的速度(4) 寄存器间接寻址方式-访问数组元素(5) 变址寻址方式(6) 基址变址寻址方式(7) 相对基址变址寻址方式 (5),(6),(7)都便于处理数组元素. 与数据有关的寻址方式中,提供地址的寄存器只能是 BX,

4、SI,DI 或 BP. 与转移地址有关的寻址方式的一般用途:(1) 段内直接寻址-段内直接转移或子程序调用(2) 段内间接寻址-段内间接转移或子程序调用(3) 段间直接寻址-段间直接转移或子程序调用(4) 段间间接寻址-段间间接转移或子程序调用汇编程序和汇编语言1. 汇编程序. 汇编程序是将汇编语言源程序翻译成二进制代码程序的语言处理程序,翻译的 过程称为汇编。2. 汇编语言. 汇编语言是用指令助记符,各种标识变量,地址,过程等的标识符书写程序的语言, 汇编语言 指令与机器指令一 一对应。. 伪指令,宏指令不是由 CPU 执行的指令,而是由汇编程序在汇 编期间处理的指令。. 伪指令指示汇编程序

5、如何完成数据定义,存储空间分配,组织段等工作。 . 宏指令可简化程序并减少程序书写量。. 条件汇编伪指令的功能是确定是否汇编某段源程 序,而不是实现程序分支,对未汇编的程序将不产生相应的目标代码。. 结构作为一种数据结 构可将一组类型不同但有逻辑关联的数据组织在一起,便于 整体处理数据。. 记录可用于提 高存储单元的利用率,将若干不足一个字节或字且有逻辑关联的信 息压缩存放在一个字节 或字中。. 指令中的表达式在汇编期间计算,并且只能对常量或地址进行计算。程序设计基础1. 分支程序设计. 程序分支由条件转移指令或无条件转移指令实现. 存放若干目的转移地址或跳转指令的跳 转表常用于实现多路分支.

6、 条件转移指令只能实现偏移量为-128 至+127 字节范围的转移. 无条件转移指令根据寻址方式可实现短转移(偏移量为-128 至+127 字节),段内转 移,段间转 移。2. 循环程序设计. 可由循环控制指令或条件转移指令组织循环结构. 内层循环结构必须完 全包含在外层循环结构内,并不能发生从循环结构外向循环 结构内的转移。3. 子程序设计. 子程序中应保护寄存器内容,并正确使用堆栈, 成对执行 PUSH 和 POP 指令, 保证执行 RET 指令时堆栈栈顶为返回地址。. 主程序可通过寄存器,参数表,或堆栈传递参数 给子程序4. EXE 文件和 COM 文件. 二者都是可执行文件. COM

7、文件源程序的特点是: 第一条可执行指令的起始存放地址必须 是 100H,不能分段,不用定义堆栈,所有过程为 NEAR 类型,直接用 INT 20H 指令返回 DOS。 5. DOS 功能调用与 BIOS 中断调用. 二者都是完成 DOS 系统提供给用户的输入/输出等常用功能,通过执行软中断指令 完成一 次软中断服务。. DOS 功能调用的中断服务程序是操作系统的一部分,存于 RAM 中; 而 BIOS 中断调用的中断服务程序存放在 ROM 中。输入/输出与中断系统1. 输入/输出的方式. 程序直接 I/O 方式: 用 IN 和 OUT 指令直接在端口级上进行 I/O 操作, 数据传送方式 分为

8、无条件传送方式和查询传送方式。. 中断传送方式: 由 CPU 响应中断请 求完成中断服务。. DMA 传送方式: 直接在存储器与外设之间传送数据。2. 有关中断的概念. 中断、中断源、中断请求、中断服务、中断向量、中断向量表、中断响应过程、中断指 令、开中断、关中断、内部中断、外部中断、可屏蔽中断、非屏蔽中断。3. 键盘 I/O、显示器 I/O 操作. 键盘的输入操作用 BIOS 的 16H 中断调用控制,也可直接访问 60H 端口(数据端口), 61H 端 口(状态端口)检测键盘的按键操作。. 对于特殊键(如 Shift , Ctrl , Alt , NumLock , ScrollLock

9、 等键)的按动情况,可以直接从来 40:17H 单元取得有关信息。. 显示器的图形显示可以用 BIOS 的 10H 中断调用实现,另一种速度更快的方法是直 接读写 视频缓冲区。4. 打印机 I/O 操作由 INT 17H 中断调用实现, 串行通讯口操作由 INT 14H 中断调用实现。CLD Clear the direction flag (set to forward direction)将方向标志置 0,使 si 和 di 增量,串处 理从低地址向高地址处理8088 汇编速查手册一、数据传输指令它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据.1. 通用数据传送指令.MOV传送字或

10、字节.MOVSX先符号扩展,再传送.MOVZX先零扩展,再传送.PUSH把字压入堆栈.POP把字弹出堆栈.PUSHA把 AX,CX,DX,BX,SP,BP,SI,DI 依次压入堆栈.POPA把 DI,SI,BP,SP,BX,DX,CX,AX 依次弹出堆栈.PUSHAD把 EAX,ECX,EDX, EBX,ESP,EBP,ESI,EDI 依次压入堆栈.POPAD把 EDI,ESI,EBP,ESP,EBX,EDX, ECX,EAX 依次弹出堆栈.BSWAP交换 32 位寄存器里字节的顺序XCHG交换字或字节.( 至少有一个操作数为寄存器,段寄存器不可作为操作数) CMPXCHG 比较并交换操作数.

11、( 第二个操作数必须为累加器 AL/AX/EAX )XADD先交换再累加.( 结果在第一个操作数里 )XLAT字节查表转换. BX 指向一张 256 字节的表的起点, AL 为表的索引值 (0-255,即 0-FFH); 返回 AL 为 查表结果. ( BX+AL-AL )2. 输入输出端口传送指令.INI/O 端口输入. ( 语法: IN 累加器, 端口号DX )OUTI/O 端口输出. ( 语法: OUT 端口号DX,累加器 )输入输出端口由立即方式指定时, 其范围是 0-255; 由寄存器 DX 指定时,其范围是 0- 65535.3. 目的地址传送指令.LEA装入有效地址. 例: LE

12、A DX,string;把偏移地址存到 DX.LDS传送目标指针,把指针内容装入 DS.例: LDS SI,string;把段地址:偏移地址存到 DS:SI.LES传送目标指针,把指针内容装入 ES.例: LES DI,string;把段地址:偏移地址存到 ES:DI.LFS传送目标指针,把指针内容装入 FS.例: LFS DI,string;把段地址:偏移地址存到 FS:DI.LGS传送目标指针,把指针内容装入 GS.例: LGS DI,string;把段地址:偏移地址存到 GS:DI.LSS传送目标指针,把指针内容装入 SS.例: LSS DI,string;把段地址:偏移地址存到 SS:

13、DI.4. 标志传送指令.LAHF标志寄存器传送,把标志装入 AH.SAHF标志寄存器传送,把 AH 内容装入标志寄存器.PUSHF标志入栈.POPF标志出栈.PUSHD32 位标志入栈.POPD32 位标志出栈.二、算术运算指令ADD 加法.ADC带进位加法.INC加 1.AAA加法的 ASCII 码调整.DAA加法的十进制调整.SUB减法.SBB带借位减法.DEC减 1.NEC求反(以 0 减之).CMP比较.(两操作数作减法,仅修改标志位,不回送结果).AAS减法的 ASCII 码调整.DAS减法的十进制调整.MUL无符号乘法.IMUL整数乘法.以上两条,结果回送 AH 和 AL(字节运

14、算),或 DX 和 AX(字运算), AAM乘法的 ASCII 码调整.DIV无符号除法.IDIV整数除法.以上两条,结果回送:商回送 AL,余数回送 AH, (字节运算);或商回送 AX,余数回送 DX, (字运算).AAD除法的 ASCII 码调整.CBW字节转换为字. (把 AL 中字节的符号扩展到 AH 中去)CWD字转换为双字. (把 AX 中的字的符号扩展到 DX 中去) CWDE字转换为双字. (把 AX 中的字符号扩展到 EAX 中去)CDQ双字扩展.(把 EAX 中的字的符号扩展到 EDX 中去)三、逻辑运算指令AND与运算.OR或运算.XOR异或运算.NOT取反.TEST测

15、试.(两操作数作与运算,仅修改标志位,不回送结果).SHL逻辑左移.SAL算术左移.(=SHL)SHR逻辑右移.SAR算术右移.(=SHR)ROL循环左移.ROR循环右移.RCL通过进位的循环左移.RCR通过进位的循环右移.以上八种移位指令,其移位次数可达 255 次.移位一次时, 可直接用操作码.如 SHL AX,1.移位1 次时, 则由寄存器 CL 给出移位次数.如MOV CL,04SHL AX,CL四、串指令DD:SI源串段寄存器:源串变址.EE:DI目标串段寄存器:目标串变址.CX重复次数计数器.AL/AX扫描值.D 标志0 表示重复操作中 SI 和 DI 应自动增量; 1 表示应自动

16、减量.Z 标志用来控制扫描或比较操作的结束.MOVS串传送.( MOVSB传送字符.MOVSW传送字.MOVSD传送双字. ) CMPS串比较.( CMPSB比较字符.CMPSW比较字. )SCAS串扫描.把 AL 或 AX 的内容与目标串作比较,比较结果反映在标志位.LODS装入串.把源串中的元素(字或字节)逐一装入 AL 或 AX 中.( LODSB传送字符.LODSW传送字.LODSD传送双字. ) STOS保存串. 是 LODS 的逆过程.REP当 CX/ECX0 时重复.REPE/REPZ当 ZF=1 或比较结果相等,且 CX/ECX0 时重复.REPNE/REPNZ当 ZF=0 或

17、比较结果不相等,且 CX/ECX0 时重复. REPC当 CF=1 且 CX/ECX0 时重复.REPNC当 CF=0 且 CX/ECX0 时重复.五、程序转移指令1无条件转移指令 (长转移)JMP无条件转移指令CALL过程调用 RET/RETF 过程返回.2条件转移指令 (短转移,-128 到+127 的距离内)( 当且仅当(SF XOR OF)=1 时,OP1循环控制指令(短转移)LOOPCX 不为零时循环.LOOPE/LOOPZCX 不为零且标志 Z=1 时循环.LOOPNE/LOOPNZCX 不为零且标志 Z=0 时循环.JCXZCX 为零时转移.JECXZECX 为零时转移.4中断指

18、令INT中断指令INTO 溢出中断IRET中断返回5处理器控制指令 HLT处理器暂停, 直到出现中断或复位信号才继续.WAIT当芯片引线 TEST 为高电平时使 CPU 进入等待状态.ESC转换到外处理器.LOCK封锁总线.NOP空操作.STC置进位标志位.CLC清进位标志位.CMC进位标志取反.STD置方向标志位.CLD清方向标志位.STI置中断允许位.CLI清中断允许位.六、伪指令DW定义字(2 字节).PROC定义过程.ENDP过程结束.SEGMENT 定义段.ASSUME建立段寄存器寻址.ENDS段结束. END程序结束.汇编语言基础知识汇编语言和 CPU 以及内存,端口等硬件知识是连

19、在一起的. 这也是为什么汇编语言没有通用 性的原因. 下面简单讲讲基本知识(针对 INTEL x86 及其兼容机)=x86 汇编语言的指令,其操作对象是 CPU 上的寄存器,系统内存,或者立即数. 有些指令表 面上没有操作数, 或者看上去缺少操作数, 其实该指令有内定的操作对象, 比如 push 指令, 一定是对 SS:ESP 指定的内存操作, 而 cdq 的操作对象一定是 eax / edx.在汇编语言中,寄存器用名字来访问. CPU 寄存器有好几类, 分别有不同的用处: 1. 通用寄存器:EAX,EBX,ECX,EDX,ESI,EDI,EBP,ESP(这个虽然通用, 但很少被用做除了堆栈指

20、针外的用途) 这些 32 位可以被用作多种用途,但每一个都有专长. EAX 是累加器(accumulator), 它 是很多加法乘法指令的缺省寄存器. EBX 是基地址(base)寄存器, 在内存寻址时存放基地 址. ECX 是计数器(counter), 是重复(REP)前缀指令和 LOOP 指令的内定计数器. EDX 是.(忘了. 哈哈)但它总是被用来放整数除法产生的余数. 这 4 个寄存器的低 16 位可以被单独访问,分 别用 AX,BX,CX 和 DX. AX 又可以单独访问低 8 位(AL)和高 8 位(AH), BX,CX,DX 也类似. 函数的 返回值经常被放在 EAX 中.ESI

21、/EDI 分别叫做源/目标索引寄存器(source/destination index),因为在很多字符串操作 指令中, DS:ESI 指向源串,而 ES:EDI 指向目标串.EBP 是基址指针(BASE POINTER), 它最经常被用作高级语言函数调用的框架指针 (frame pointer). 在破解的时候,经常可以看见一个标准的函数起始代码:push ebp ;保存当前 ebpmov ebp,esp ;EBP 设为当前堆栈指针sub esp, xxx ;预留 xxx 字节给函数临时变量.这样一来,EBP 构成了该函数的一个框架, 在 EBP 上方分别是原来的 EBP, 返回地址和 参数

22、. EBP 下方则是临时变量. 函数返回时作 mov esp,ebp/pop ebp/ret 即可.ESP 专门用作堆栈指针.2. 段寄存器:CS(Code Segment,代码段) 指定当前执行的代码段. EIP (Instruction pointer, 指令指针) 则指向该段中一个具体的指令. CS:EIP 指向哪个指令, CPU 就执行它. 一般只能用 jmp, ret, jnz, call 等指令来改变程序流程,而不能直接对它们赋值.DS(DATA SEGMENT, 数据段) 指定一个数据段. 注意:在当前的计算机系统中, 代码和数 据没有本质差别, 都是一串二进制数, 区别只在于你

23、如何用它. 例如, CS 制定的段总是被用 作代码, 一般不能通过 CS 指定的地址去修改该段. 然而,你可以为同一个段申请一个数据段 描述符别名而通过 DS 来访问/修改. 自修改代码的程序常如此做.ES,FS,GS 是辅助的段寄存器, 指定附加的数据段.SS(STACK SEGMENT)指定当前堆栈段. ESP 则指出该段中当前的堆栈顶. 所有 push/pop 系列指令都只对 SS:ESP 指出的地址进行操作.3. 标志寄存器(EFLAGS):该寄存器有 32 位,组合了各个系统标志. EFLAGS 一般不作为整体访问, 而只对单一的标 志位感兴趣. 常用的标志有: 进位标志 C(CAR

24、RY), 在加法产生进位或减法有借位时置 1, 否则为 0.零标志 Z(ZERO), 若运算结果为 0 则置 1, 否则为 0符号位 S(SIGN), 若运算结果的最高位置 1, 则该位也置 1.溢出标志 O(OVERFLOW), 若(带符号)运算结果超出可表示范围, 则置 1.JXX 系列指令就是根据这些标志来决定是否要跳转, 从而实现条件分枝. 要注意,很多 JXX 指令是等价的, 对应相同的机器码. 例如, JE 和 JZ 是一样的,都是当 Z=1 是跳转. 只有JMP 是无条件跳转. JXX 指令分为两组, 分别用于无符号操作和带符号操作. JXX 后面的XX 有如下字母:无符号操作:

25、 带符号操作:A = ABOVE, 表示高于 G = GREATER, 表示大于B = BELOW, 表示低于 L = LESS, 表示小于C = CARRY, 表示进位或借位 O = OVERFLOW, 表示溢出S = SIGN, 表示负通用符号:E = EQUAL 表示等于, 等价于 Z (ZERO)N = NOT 表示非, 即标志没有置位. 如 JNZ 如果 Z 没有置位则跳转Z = ZERO, 与 E 同.如果仔细想一想,就会发现 JA = JNBE, JAE = JNB, JBE = JNA, JG = JNLE, JGE= JNL, JL= JNGE, .4. 端口端口是直接和外部

26、设备通讯的地方。外设接入系统后,系统就会把外设的数据接口映 射到特定的端口地址空间,这样,从该端口读入数据就是从外设读入数据,而向外设写入 数据就是向端口写入数据。当然这一切都必须遵循外设的工作方式。端口的地址空间与内 存地址空间无关,系统总共提供对 64K 个 8 位端口的访问,编号 0-65535. 相邻的 8 位端口 可以组成成一个 16 位端口,相邻的 16 位端口可以组成一个 32 位端口。端口输入输出由指 令 IN,OUT,INS 和 OUTS 实现,具体可参考汇编语言书籍。汇编指令的操作数可以是内存中的数据, 如何让程序从内存中正确取得所需要的数据就是 对内存的寻址。INTEL

27、的 CPU 可以工作在两种寻址模式:实模式和保护模式。 前者已经过时,就不讲 了, WINDOWS 现在是 32 位保护模式的系统, PE 文件就基本是运行在一个 32 位线性 地址空间, 所以这里就只介绍 32 位线性空间的寻址方式。其实线性地址的概念是很直观的, 就想象一系列字节排成一长队,第一个字节编号为 0, 第二个编号位 1, 。一直到 4294967295(十六进制 FFFFFFFF,这是 32 位二进制数 所能表达的最大值了)。 这已经有 4GB 的容量! 足够容纳一个程序所有的代码和数据。 当 然, 这并不表示你的机器有那么多内存。 物理内存的管理和分配是很复杂的内容, 初学 者不必在意, 总之, 从程序本身的角度看, 就好象是在那么大的内存中。在 INTEL 系统中, 内存地址总是由段选择符:有效地址的方式给出。段选择符 (SELECTOR)存放在某一个段寄存器中, 有效地址则可由不同的方式给出。 段选择符通过 检索段描述符确定段的起始地址, 长度(又称段限制), 粒度, 存取权限, 访问性质等。 先不用深究这些, 只要知道段选择符可以确定段的性质就行了。 一旦由选择符确定了段, 有效地址相对于段的基地址开始算。 比如由选择符 1A7 选择的数据段, 其基地址是 400000, 把 1A7 装入

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1