
32位PC机汇编程序设计.ppt
138页1 概述n汇编语言基本概念n程序汇编连接与调试方法1 汇编语言基本概念一、汇编语言相关特征l机器语言是一种用二进制代码编写指令和程序的语言例: B0 04 传送指令,将4送到累加器AL中l汇编语言用助记符代替指令的操作码,用数字或符号代替指令 中操作数或操作数存放位置的一种程序设计语言例: MOV AL , 04 ;传送指令,将4送到累加器AL中MOV EAX , 200209281 汇编语言基本概念二、汇编语句行基础知识基本格式[名字] 操作符 [操作数] [;注释]操作符: 机器指令、伪指令、宏指令的助记符操作数:操作数项有多个操作数时,用逗号 ,分开1 汇编语言基本概念三、汇编语言源程序示例 1、程序的层次模块结构源程序堆栈段数据段代码段DEBUG直接编程初始化输 入运算处理转 换输 出返回DOS数值运算非数值运算1 汇编语言基本概念n汇编语言与机器特性密切相关汇编语言硬件特性CPU工作方式CPU寄存器体系指令系统存储管理机制中断与外部设备…依赖于充分发挥1 汇编语言基本概念2、源程序的分段结构及示例说明 例:程序输出显示:“ Welcome !”,流程描述如下:定义堆栈段定义数据段定义代码段源程序模块结束指示段寄存器初始化显示输出字符串自动返回 DOS 源程序SAMPLE.ASM:STACKS SEGMENT STACKDW 128 DUP(?)STACKS ENDSDATAS SEGMENTSTRING DB ‘Welcome!’,13h,10h,’$’DATAS ENDSCODES SEGMENTASSUME CS:CODE,DS:DATASSTART: MOV AX , DATASMOV DS, AX LEA DX , STRINGMOV AH , 09HINT 21HMOV AX , 4C00HINT 21HCODES ENDSEND START堆栈段数据段代码段源程序模块结束2 程序汇编连接与调试方法设计、编写源程序(数据结构+算法+编码)汇编语言源程序文件(*.ASM)目标代码程序文件(*.OBJ)可执行程序文件(*.EXE/*.COM)运行正确?调试运行正确?结束否否否是是调试DEBUG编辑EDIT连接LINK执 行汇编MASM2 程序汇编连接与调试方法一、程序编辑利用熟悉的文本编辑软件,对汇编语言源程序进行 编辑,生成 .ASM文件。
汇编语言使用过程中,生成不同文件后缀名的含义:.ASM 汇编源程序 .OBJ 目标文件 .LST 列表文件 .CRF 交叉引用文件 .MAP 分配图文件 .LIB 库文件 .DEF 定义文件 .EXE / .COM 可执行文件2 程序汇编连接与调试方法二、程序汇编与连接执行n汇编程序 MASM.EXEMASM / ? 查看命令参数n连接程序 LINK.EXELINK / ? 查看命令参数n汇编连接程序 ML.EXEML / ? 查看命令参数n汇编过程:对源程序扫描后生成目标文件 .OBJ如有语法错误,则显示相应的错误信息,返回修改源 程序2 程序汇编连接与调试方法n汇编示例: D:\MASM6> masm p1.asm显示如下: Assembling:p1.asmp1.asm(12):error A2006:undefined symbol:FIVE1表示:源程序12行有错,未定义符号 FIVE1源程序一直到修改后汇编无错误,则生成 p1.objn连接: D:\MASM6> link p1n生成执行文件 p1.exe 则可直接运行:D:\MASM6> p1 2 程序汇编连接与调试方法三、程序跟踪调试n汇编过程中可以检查程序的语法错误n汇编无误,生成可执行文件后,运行没有达到预期的 结果,程序可能存在逻辑错误。
需要用调试工具进行 跟踪调试,查找程序的逻辑错误n常用调试工具程序: DEBUG.EXE提供一个监控程序环境,通过提供命令和相关参数了 解程序执行过程中各寄存器和存储单元的值及其变化 情况,帮助确定程序中的问题全部命令的详细格 式参见教材附录)2 指令系统n指令格式n指令寻址方式n指令集2.1指令的基本格式 nIntel 32位处理器指令格式指令长度不能超过15个字节前缀 操作码 寻址方式 位移量 立即数0~3B 1~2B 0~2B 0~4B 0~4B 16位寻址方式n立即寻址n寄存器寻址n直接寻址n寄存器间接寻址n寄存器相对寻址n基址变址寻址n相对基址变址寻址2.2 寻址方式n 32位的指令寻址包括数据寻址和程序 转移寻址现介绍如下:1、非存储器的数据寻址方式示例n(1)立即寻址n MOV EAX,19461201H; 19461201H->EAX与16位寻址相似2) 寄存器寻址nMOV EAX,ECX ;ECX->EAX与16位寻址相似2、 存储器的数据寻址方式示例n(1)直接寻址nMOV EAX,[4612H] ;EA=4612,(EA)->EAX与16位寻址相似。
n(2)寄存器间接寻址nMOV [ECX],EDX ;[ECX]间接指示存放操作数 EA在ECX 中,EA=ECX,EDX->EA,与16位寻址 相似存储器的数据寻址方式示例(续)n(3)寄存器相对寻址nMOV ECX,[EAX+24] ; EA=EAX,(EA)->ECXn(4)基址变址寻址nMOV EAX ,[EBX] [ESI] ; EA=EBX+ESI,(EA)- >EAXn(5)相对基址变址寻址nSUB EAX,[EBX+ESI+0FF0H];EA=EBX+ESI+0FF0H,EAX-(EA)->EAX存储器的数据寻址方式示例(续)(6)带比例因子的变址nMOV ECX,[ESI*4];EA=ESI×4,(EA)->ECX (7)基址与带比例因子的变址寻址nMOV ECX,[EAX][EDX*8];EA=EAX+EDX×8,(EA)->ECX (8)基址与带位移量及比例因子的变址寻址nMOV EAX,LTAB[EDI*4][EBP+80];EA=LTAB+EDI×4+EBP+80,(EA)->EAX3.程序转移寻址方式n有相对EIP的段内直接寻址,段内间接寻址、 段间直接寻址和段间间接寻址。
n段内转移是指程序在同一段代码内,仅改变EIP 的值而不改变CS的值所发生的转移n而段间转移是程序要从一个代码段转移到另一 个代码段,则不仅改变EIP的值,同时也要改变CS 的值n无论是段内还是段间发生的转移都有直接和间 接的形式,因此程序转移有四种寻址n1.段内直接寻址(Intrasegment Direct Addressing)转移偏移地址EA是指令中位移量(与指令指针 IP当前内容之和即:EA = IP + DISP -> IPn2.段内间接寻址(Intrasegment Indirect Addressing)转移偏移地址 EA 如果指定的是寄存器,则将寄 存器的内容->IP 如果指定的是存储器中的一 个字,则将该存储单元的内容->IP段内转移过程段内转移图示n段内直接转移和间接 转移寻址如下图:段间转移过程n1.段间直接寻址(Intersegment Direct Addressing)n 用指令中直接提供的转移偏移地址EA->IP,指令 同时直接提供的转移段地址->CS, 实现从一个代码 段转移到另一个代码段n2.段间间接寻址(Intersegment Indirect Addressing)n 根据存储器的数据寻址方式获得EA,再将EA双字 单元第一个字的内容作为转移偏移地址->IP,EA双 字单元第二个字的内容作为转移段地址->CS,然后 CS+IP形成指令的实际转移地址。
段间转移图示n程序段间的直接或间接转移如下图:4.前缀代码67H或66Hn32位机汇编指令或有32位操作数的情形识别涉 及指令机器码格式的有关前缀表示这些在相 应的汇编列表文件(*.LST)或DEBUG过程中可 以看到,如前缀代码67H或66H1)机器指令操作数长度属性前缀码66Hn66|83 E0 0F AND EAX,0FH;EAX^0FH->EAX66|8B CB MOV ECX,EAX(2)机器指令寻址长度续性前缀n67|8B 1475 00000026MOV DX,26H[ESI*2]n67|66|8B 04B0MOV EAX,[EAX+ESI*4]3.3 指令系统n指令系统是一台机器所有指令的集合 Pentium系列机指令系统庞大、类型多样,约有 300多条指令,其中包括基本指令100多条 具 有支持多进程、多任务、虚拟存储器和多媒体 等功能的32位指令常用指令类型集n1.数据传送类指令n2.算术运算类指令n3.逻辑和移位操作类指令n4.串操作与重复前缀类指令n5.控制转移类指令n6.处理机控制类指令n7.其它指令本讲义约定:nOPD表示目的操作数; OPS表示源操作数; (OPS)表示OPS的内容; (OPD)表示OPD的内容; ->表示传送; R表示通用寄存器; Sr表示段寄存 器; M表示主存储器; nXXXX:XXXX 表示组合号, “:”表示其前后组成一 个数; L表示操作数的长度; d表示立即数; B/W/D表示字节或字或双字。
数据传送类指令n通用数据传送指令n堆栈操作指令n标志寄存器传送指令n地址传送指令n输入输出指令通用数据传送指令n1.传送指令MOVn2.数据交换指令XCHGn3.查表转换指令 XLAT语句格式:MOV OPD,OPSn功能:将源操作数传送入目的地址,源地 址内容不变即(OPS)→OPDn下图描述了MOV指令在传送数据时允许传送 的路径及类型1.传送指令MOV注意:n(1) OPD,OPS的类型(8/16/32位)必须一致.n(2) OPD不能使用立即数n(3) 双操作数不能同时为内存中的数据n(4) 段寄存器不能直接送立即数.n(5) 指令执行后不影响FLAGS的标志位的状态.n(6) 不能任意改变CS示例:存储器与寄存器间数据传送nMOV AX,BUF ;BUF是变量,源操作数为直接寻址nMOV BH,[DI] ;源操作数为寄存器间接寻址nMOV DI,ES:3[SI] ;源操作数为变址寻址,使用跨段前 缀nMOV BP,3[BX+SI ] ;源操作数为基址加变址寻址nMOV BUFA,DL ;BUFA是一字节变量nMOV [BP],AX ;使用SS段寄存器nMOV DS:[BP],DL ;使用跨段前缀nMOV BUF,DS ;BUF是个字变量nMOV ES ,BUF2.数据交换指令XCHGn语句格式:XCHG OPD,OPSn功能:将源地址与目的地址中的内容互换。
即(OPD)→OPS,(OPS)→OPDn寄存器与存储器之间数据交换nMOV AX,5678H;(AX)=5678HnMOV BX,0FFFFH ;(BX)=0FFFFHnXCHG AX,BX;(AX)=0FFFH,(BX)=5678HMOVSX和MOVZX指令n格式:MOVSX OPD, OPS MOVZX OPD, OPSn它们将OPS的内容->OPD,但是对于OPD左边空缺 的位,MOVSX全部用OPS的符号填充(作符号延伸 ), 可以对有符号的数进行符号扩展;而MOVZX是 全部以零(0)填充,可对无符号数进行0扩展。
