




已阅读5页,还剩131页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1 新编汇编语言程序设计 2 第二章数据定义与传送 2 1数据的定义2 2数据的传送2 3汇编语言上机操作 3 2 1数据的定义 2 1 1数据段2 1 2数据定义 4 汇编语言程序定义的 数据 1 变量 Variable 有一个名字 运行过程中值可能发生变化 定义时可以设置 初始值 2 常数 Constant 可以直接写在指令内 也可以存放在数据段内 3 缓冲区 Buffer 从输入设备输入若干数据时 需要在数据段里事先留出必要的存储单元 称为 输入缓冲区 输出一批数据时 需要把输出内容事先存放在若干内存单元中 称为 输出缓冲区 5 2 1 1数据段 DATASEGMENT 在这里定义数据 DATAENDS DATA 程序员给这个段起的名字 SEGMENT 保留字 说明一个段从这里开始 ENDS 保留字 说明一个段到此结束 分号后面的文字是 注释 不参加汇编 6 伪指令 说明性的语句 汇编后不会产生对应的机器指令 2 1 1数据段 数据段名SEGMENT 数据段名ENDS 7 2 1 2数据定义 数据定义伪指令 变量名 数据定义伪指令助记符数据 数据 数据定义伪指令助记符 DB DefineByte 每个数据占用一个字节 8b DW DefineWord 每个数据占用一个字 16b DD DefineDoubleWord 每个数据占用一个双字 32b DQ DefineQuartWord 每个数据占用8个字节 64b DT DefineTenByte 每个数据占用10个字节 80b 8 DATASEGMENTXdb 1 255 A 3 2 db ABC 0FFH 11001010BYdb3dup DATAENDS 数据定义举例 1 有符号数用它的补码存储字符用ASCII代码存储 表示一个尚未确定的值DUP表示重复定义变量名代表这个单元的地址 9 DSEGSEGMENTZDW 2 32768 65535 AB WDD12345678H 400000DWZ W ZDSEGENDS 数据定义举例 2 多字节数据的高位存放在较高地址单元中出现在数据部分的变量名代表这个变量的偏移地址 10 变量名 符号地址 表示存储空间的首地址符号地址可有可无有符号地址 可以方便存取变量属性 段属性 SEG 偏移属性 OFFSET 类型 TYPE 长度 LENGTH 大小 SIZE 数据定义伪指令 变量名 数据定义伪指令助记符数据 数据 2 1 2数据定义 DATASEGMENTXdb 1 255 A 3 2 DATAENDS 11 变量X Y Z W的属性 DATASEGMENTXdb 1 255 A 3 2 db ABC 0FFH 11001010BYdb3dup DATAENDS DSEGSEGMENTZDW 2 32768 65535 AB WDD12345678H 400000DWZ W ZDSEGENDS 12 操作数 是用逗号分割的常数表达式 不确定dup 复制操作符可以是字符串可以是变量名 2 1 2数据定义 数据定义伪指令 变量名 数据定义伪指令助记符数据 数据 13 例 Xdw23Ydb23Zdb Mdw db3 2dup 1 2 dw3 2dup 1 2 3 1 2 1 2 2 1 2数据定义 14 例 str1db a b str2db ab str3dw a b str4dw ab 6162hstr5dw abc str1db hello str2dw hello 2 1 2数据定义 15 mess1db12 13mess2dw24mess3dwmess1mess4ddmess2 mess3 mess1的偏移地址 mess4 mess2的偏移地址 mess2的段基址 2 1 2数据定义 16 练习 某数据段内有如下数据定义 Xdb30 30H ABC 2 3 11001010Bdw0FFH 2 CD Ydd20dup 15 3dup 0 Zdb3dup WdwZ X假设变量X的偏移地址为20H 1 写出变量X各数据在内存中的具体位置和内存单元的值 2 写出变量Y Z的偏移地址 3 写出变量W对应的内存单元的值 17 2 2数据的传送 2 2 1指令格式2 2 2程序段2 2 3基本传送指令2 2 4其他传送指令2 2 5堆栈2 2 6操作数表达式 18 汇编语言程序由若干 语句 组成 每个 语句 占用一行 三种类型语句 指令语句 包含一条符号指令 与一条机器指令相对应 汇编以后是机器指令的二进制代码 这个代码被称为 目标 Object 伪指令语句 一条说明性的语句 伪指令本身汇编后不产生 目标 注释行 书写说明性文字 不进行 汇编 也不产生 目标 19 伪指令和指令的区别 与CPU有关不同的CPU类型有不同的指令系统 与汇编程序有关汇编程序的版本不同 所提供的伪指令不同 使CPU产生动作 不产生CPU动作 指令的执行是在程序的运行期间 在程序执行前 汇编期间 由汇编程序来处理 产生目标代码 不产生目标代码 MOVAX 1234HLEAAX 1234H DB MODELSMALL 20 1 80X86指令格式 如 BEGIN MOVAX 0 将0传送给AX 标号 程序员给这一行起的名字 后面跟上冒号 代表这一行的地址 标号用字母开始 不要使用保留字作为标号 操作码是这条指令需要完成的操作 用指令助记符表示 标号 操作码 操作数 注释 2 2 1指令格式 21 操作数 是指令的操作对象 指令的操作数可以0 3个 两个操作数时 右面的操作数称为 源操作数 左面的操作数称为 目的操作数 源操作数 参与指令操作 不保存结果 内容不会改变 目的操作数 参与指令操作 还保存指令的操作结果 指令执行后 目的操作数的内容被改变 注释 用来添加一些说明 例如说明本行指令的功能 1 80X86指令格式 标号 操作码 操作数 注释 如 BEGIN MOVAX 0 将0传送给AX 22 2 操作数 1 寄存器操作数 包括段寄存器 数据寄存器 地址寄存器例如 MOVBX AX功能 AX寄存器内容送入BX寄存器 AX是 源操作数 写在右边 指令执行后 它的内容不会被改变 BX是 目的操作数 写在左边 指令执行后 它的内容将被改变 注意 专用寄存器IP EIP和FLAGS EFLAGS不能作为操作数出现在指令中 23 2 立即数操作数 二进制 十进制 十六进制常数 可求值的表达式 字符 标号等 常数300送入BX寄存器MOVBX 300或者 MOVBX 150 2 DATA段的段基址送DSMOVAX DATAMOVDS AX 注意 立即数不能用作 目的操作数 24 为了对存储器的一个单元进行访问 需要给出这个单元的段基址和偏移地址 大多数情况下 指令使用DS寄存器的内容作为操作数的段基址 指令中不需要再指出段基址 3 存储器操作数 指出偏移地址的方法有两种 直接的和间接的 25 1 直接 偏移 地址 在指令里直接写出存储单元的偏移地址 DATASEGMENTADB12 34 56ARRAYDW55 66 77 88 99DATAENDS 把变量 数组 A的前两个数据送BL BH寄存器 MOVBL A 也可以写作MOVBL A MOVBH A 1 或MOVBH A 1 MOVBH A 1 A代表数据 12 的偏移地址 A 1是数据 34 的偏移地址 MOVBX A 把变量 A 送BL 变量 A 1 送BH 错误 26 1 直接 偏移 地址 在指令里直接写出存储单元的偏移地址 DATASEGMENTADB12 34 56ARRAYDW55 66 77 88 99DATAENDS 假设已经知道A的偏移地址是0000H 前面的指令可以写作 MOVBL 0000H 方括号不能省略MOVBH 0001H 方括号不能省略常数地址格式一般没有实用价值 上面的两条指令可以用一条指令代替 效果相同 MOVBX 0000H 取地址0000H开始的两字节 送入BL和BH 27 举例1 假设已经定义 XDW350MOVBX XMOVBL X举例2 MOVAL 2100H MOVAX 2100H MOVEAX 2100H 是16位传送指令 正确 是错误的 操作数类型不匹配 正确 8位传送指令 2100H是字节地址 正确 16位传送指令 2100H是字地址 正确 32位传送指令 2100H是双字地址 28 2 间接 偏移 地址 把存储单元的偏移地址先装入某个寄存器 通过这个寄存器来找到这个存储单元 也称为 寄存器间接寻址 注意 16位80X86微处理器只有BX BP SI DI这4个寄存器可以用来 间接寻址 不另加说明的话 使用BP时自动用SS的值作为段基址 使用BX SI DI时自动用DS的值作为段基址 举例1 已经定义 ADB12 34MOVSI OFFSETA 把变量A的偏移地址装入SI OFFSET是保留字 表示取出后面变量的偏移地址MOVBL SI 变量A的第一个值送BLMOVBH SI 1 第二个值送BH MOVBH 1 SI 29 举例2 已经定义 ARRAYDW35 73 27 780 12 55取出字数组ARRAY的第3个元素送入AX 方法1MOVAX ARRAY 4 ARRAY代表数组首地址 位移量 4 直接寻址 也可以写作MOVAX ARRAY 4 方法2MOVBX OFFSETARRAY 数组首地址装入BXMOVAX BX 4 第3个元素距数组首元素4个字节 方法3MOVBX 4 第3个元素距数组首地址的位移量装入BXMOVAX ARRAY BX ARRAY代表数组首地址 BX中是位移量 30 2 间接 偏移 地址 基址变址寻址 用两个寄存器联合起来寻址 从 BX BP 和 SI DI 中各选出一个使用 出现BP时使用SS作为段基址寄存器 其它情况用DS 例 MOVAX BX SI 基址 BX 变址 SI 寻址 31 寻址方式 立即数寻址寄存器寻址存储器寻址 直接寻址寄存器间接寻址寄存器相对寻址基址变址寻址相对基址变址寻址 32 1立即数寻址 例 MOVAL 05H AL 05HMOVAX 0102H AX 0102HMOVAX ab MOVAX 0B012H 立即寻址 33 2寄存器寻址方式 例 MOVBX 1234H BX 1234HMOVAX BX AX BX 寄存器寻址 可用寄存器 段寄存器 DS CS SS ES 数据寄存器 AX BX CX DX 地址寄存器 BX BP SI DI 34 3直接寻址 例 MOVAX 2000H AX DS 2000HMOVAX ARRAY AX ARRAY 直接寻址 35 例 MOVAX BX AX DS BX 4寄存器间接寻址 寄存器间接寻址 可用寄存器 地址寄存器 BX BP SI DI BP SS BX SI DI DS 36 例 MOVAX 6 SI AX DS SI 6 或MOVAX SI 6 或MOVAX COUNT SI 5寄存器相对寻址 寄存器相对寻址 37 例 MOVAX BX DI AX DS BX DI 或MOVAX BX DI 6基址变址寻址 基址变址 可用寄存器 地址寄存器 BX BP SI DI 基址寄存器 BX BP变址寄存器 SI DI 38 例 MOVAX MASK BX SI 或MOVAX MASK BX SI 或MOVAX MASK BX SI 7相对基址变址寻址 相对基址变址 39 寻址方式 立即数寻址寄存器寻址存储器寻址 直接寻址寄存器间接寻址寄存器相对寻址基址变址寻址相对基址变址寻址 40 练习 MOVAX ARRAY 4 MOVAX BX MOVAX BX 2 MOVAX ARRAY BX MOVAX BX SI MOVAX BX DI 2 直接寻址 偏移地址 ARRAY 4 寄存器间接寻址 寄存器相对寻址 寄存器相对寻址 基址 BX 变址 SI 寻址 相对基址变址寻址 41 请指出以下各指令的操作数所使用的寻址方式 1 MOVSI 2100H 2 SBBDISP BX 7 3 AND DI AX 4 ORAX 609EH 5 MOV BX DI 30H CX 6 PUSHES BP 练习 42 BX 637DH SI 2A9BH D 7237H 试确定在以下各种寻址方式下的偏移地址是多少 1 直接寻址 2 使用BX的间接寻址 3 使用BX的寄存器相对寻址 4 基址变址寻址 练习 43 现有 DS 2000H BX 0100H SI 0002H 20100 12H 20101 34H 20102 56H 20103 78H 21200 2AH 21201 4CH 21202 B7H 21203 65H 试说明下列各条指令执行完后AX寄存器的内容 1 MOVAX 1200H 2 MOVAX 1200H 3 MOVAX 1100 BX 4 MOVAX 1100 BX SI 练习 44 32位80 x86微处理器的存储器寻址 偏移地址 基址 比例因子 变址 位移量 位移量 存放在指令中的一个8位 16位或32位的数 基址 存放在基址寄存器中的内容 变址 存放在变址寄存器中的内容 比例因子 386及其后继机型 值可为1 2 4或8 直接寻址寄存器间接寻址寄存器相对寻址基址变址寻址相对基址变址寻址 相对比例变址寻址 基址比例变址寻址方式 相对基址比例变址寻址方式 45 32位80 x86微处理器的存储器寻址 MOVAX ARRAY 4 MOVAX ECX MOVAX EAX 4 MOVAX EBX ECX MOVAX EBP EDX 4 MOVAX EBX 4 ESI MOVAX 8 EBP ECX 6 直接寻址 偏移地址 ARRAY 4 寄存器间接寻址 寄存器相对寻址 基址 EBX 变址 ECX 寻址 相对基址 EBP 变址 EDX 寻址 使用SS 基址比例变址寻址 相对基址比例变址寻址 46 16 32位寻址时偏移地址四种成分的组成 直接寻址 DS间接寻址 BP ESP EBP SS 其余 DS 47 2 2 2程序段 程序段常见格式 CODESEGMENTASSUMECS CODE DS DATASTART MOVAX DATAMOVDS AX 其他指令MOVAX 4C00HINT21HCODEENDSENDSTART 48 ASSUME伪指令用来指定段和段寄存器之间的对应关系 供汇编程序使用 DATASEGMENTADB55DATAENDSDSEGSEGMENTXDB10DSEGENDS CODESEGMENTASSUMEDS DATA ES DSEG CS CODEMOVAX DATAMOVDS AXMOVAX DSEGMOVES AX CODEENDS 指令MOVAL A 自动按照MOVAL DS 0000H 的格式汇编 执行后 AL 55 指令MOVDL X 自动按照MOVDL ES 0000H 的格式汇编 执行后 DL 10 把段地址装入相应的段寄存器 代码段不需要此操作 在程序初始化时完成 49 为了得到正确结果 上面第4条指令改写为 MOVDL ES DI 执行后 DL 10 结果正确 这条指令 显式 地指定了段基址 汇编出来的机器指令比MOVDL DI 多一个字节 称为 段跨越前缀 MOVSI OFFSETA A的偏移地址装入SIMOVDI OFFSETX X的偏移地址装入DIMOVAL SI 取A的值送ALMOVDL DI 取X的值送DL执行的结果 AL 55正确 DL 55错误 50 程序段常见格式 CODESEGMENTASSUMECS CODE DS DATASTART MOVAX DATAMOVDS AX 其他指令MOVAX 4C00HINT21HCODEENDSENDSTART 2 2 2程序段 51 处理器选择伪指令 386 386P 486 486P 586 586P 686 686P 386表示程序选用80386的基本指令集 386P表示选用80386的基本指令和保护模式下的特权指令 缺省的处理器选择伪指令是 8086 指令INT21H表示调用由操作系统提供的21H号服务程序 AH中为 功能号 AH 4CH表示返回操作系统的操作 AL中的代码称为 返回代码 00H表示 正常返回 END伪指令表示整个程序到此结束 后面的标号START表示程序入口地址 52 2 2 2程序段 程序段常见格式 CODESEGMENTASSUMECS CODE DS DATASTART MOVAX DATAMOVDS AX 其他指令MOVAX 4C00HINT21HCODEENDSENDSTART 53 2 2 3基本传送指令 MOV指令的一般格式 1 MOV Move 传送 指令 MOV指令把源操作数 source 传送到目的操作数 destination MOVdest src 举例 设指令执行前 AX 2345H BX 1111H 指令 MOVAX BX 执行后 AX 1111H BX 1111H 54 源操作数可以是 寄存器 存储器 立即数 目的操作数可以是 寄存器 存储器 55 MOV指令的使用限制 源操作数与目的操作数可以是字节 字或双字 但必须有相同的类型 源操作数与目的操作数不能同时为存储器操作数 目的操作数不能是立即数 FLAGS EFLAGS IP EIP不能用作操作数 源操作数与目的操作数不能同时为段寄存器 目的操作数是段寄存器时 源操作数只能是寄存器或存储器 不能是立即数 CS不能用作目的操作数 56 1 MOV Move 传送 指令 57 MOVCL DH 字节传送指令 DH寄存器内容送入CLMOVECX EDX 双字传送指令 EDX寄存器内容送入ECXMOVAX CS 字传送指令 CS寄存器内容送入AXMOVSS CX 字传送指令 CX寄存器内容送入SS MOV指令举例 寄存器 寄存器操作数 正确 错误 MOVCL DXMOVESI BHMOVCS AXMOVDS CS 操作数类型不匹配 操作数类型不匹配 CS寄存器不能作为目的操作数 不能同时为段寄存器 58 MOVAL 30H 字节传送指令 执行后 AL 30HMOVAX 30H 字传送指令 执行后 AX 0030HMOVEAX 30H 双字传送指令 执行后 EAX 00000030HMOVAL 5 字节传送指令 执行后 AL 0FBHMOVAX 5 字传送指令 执行后 AX 0FFFBH MOV指令举例 立即数 寄存器操作数 正确 错误 MOV30H ALMOVAL 300 立即数不能用作目的操作数 源操作数超出范围 59 MOV指令举例 存储器 寄存器操作数 正确 错误 MOV BP BL 字节传送指令 BL寄存器内容送SS BP MOV BX AX 字传送指令 AL内容送DS BX AH内容送DS BX 1 MOVDX SI 字传送指令 DS SI 内容送入DL DS SI 1 内容送入DH 假设变量X BYTE用DB定义 变量Y WORD用DW定义 MOV DX BLMOVX BYTE AX DX寄存器不能用来寄存器间接寻址 操作数类型不匹配 60 MOV指令举例 存储器 立即数操作数 正确 错误 MOVX BYTE 5 字节传送指令 5 0FBH 送X BYTEMOVY WORD 5 字传送指令 5 0FFFBH 送Y WORD 假设变量X BYTE用DB定义 变量Y WORD用DW定义 MOVX BYTE 300MOV BX 30H 目的操作数超出范围 操作数类型不能确定 61 错误 MOVX BYTE SI MOVX BYTE K BYTEMOVSS DS 两个操作数不能同时为存储器操作数或段寄存器 不能同时为存储器操作数 不能同时为存储器操作数 不能同时为段寄存器操作数 62 DATASEGMENTXDB30HDATAENDSDSEGSEGMENTADB31HDSEGENDSCODESEGMENTASSUMECS CODE DS DATA ES DSEGSTART MOVAX DATAMOVDS AXMOVAX DSEGMOVES AX 把X的值传送给AL 把A的值传送给AHMOVAX 4C00HINT21HCODEENDSENDSTART MOVAL X MOVAH A MOVAL 0000H MOVAH 0000H MOVAH ES 0000H 63 可以用 PTR 指定 或强行改变操作数的类型 MOVBYTEPTR BX 20HMOVWORDPTR BX 20HMOVDWORDPTR BX 20HMOVBYTEPTR Y WORD 20HMOVAL BYTEPTR Y WORD MOVWORDPTR X BYTE 20H 20H送DS BX 20H送DS BX 00H送DS BX 1 00000020H送DS BX 开始4个字节 20H送变量Y WORD的第1个字节 变量Y WORD的第1个字节送AL寄存器 0020H送变量X BYTE开始的2个字节 格式 typePTRexpression 64 一般格式 LEA把源操作数的偏移地址装入目的操作数 2 LEA LoadEffectiveAddress 装载有效地址 指令 举例 假设变量X的偏移地址为1020H SI 4455H EAX 1020H EBP 20HLEADX XLEABX 4 EBP 2 EAX LEAREG16 MEM 执行后 DX 1020H 执行后 BX 4 20H 2 1020H 1064H 65 例 LEABX LISTMOVBX OFFSETLIST 注意 OFFSET只能和简单的符号地址相连 如 MOVBX OFFSETLIST SI 非法指令 2 LEA LoadEffectiveAddress 装载有效地址 指令 66 例2 1 编写程序 把4个元素的字节数组ARRAY清零 DATASEGMENTARRAYDB4DUP DATAENDSCODESEGMENTASSUMECS CODE DS DATASTART MOVAX DATAMOVDS AXMOVARRAY 0 第一个元素清零MOVARRAY 1 0 第二个元素清零MOVARRAY 2 0 第三个元素清零MOVARRAY 3 0 第四个元素清零MOVAX 4C00HINT21HCODEENDSENDSTART 数据传送类程序 67 MOVAX 0LEABX ARRAY 数组ARRAY首地址装入BXMOVWORDPTR BX AX 第一 第二个元素清零MOVWORDPTR BX 2 AX 第三 第四个元素清零 一次将两个元素同时清零 MOVWORDPTRARRAY 0 第一 第二个元素清零MOVWORDPTRARRAY 2 0 第三 第四个元素清零 使用立即数指令代码较长 把这个立即数事先存放在寄存器中 MOVAX 0MOVWORDPTRARRAY AX 第一 第二个元素清零MOVWORDPTRARRAY 2 AX 第三 第四个元素清零 把数组ARRAY的首地址事先装入地址寄存器 程序更简捷 68 例2 2 字数组X的最后2个元素值送入Y数组对应单元DATASEGMENTXDW55 112 37 82YDW4DUP DATAENDSCODESEGMENTASSUMECS CODE DS DATASTART MOVAX DATAMOVDS AXMOVDI 4 第三个元素在数组内的位移MOVAX X DI 取出X数组第三个元素MOVY DI AX 送入Y数组第三个元素中MOVAX X DI 2 取出X数组第四个元素MOVY DI 2 AX 送入Y数组第四个元素中MOVAX 4C00HINT21HCODEENDSENDSTART 数据传送类程序 69 2 2 4其他传送指令 1 地址传送指令LDS LES LFS LGS 功能 从存储器取出4B 前面的2B送入指定的寄存器 后面的2B送入由指令操作码包含的段寄存器 格式 LDSREG16 MEM32 从存储器取出4B 送入REG16和DSLESREG16 MEM32 从存储器取出4B 送入REG16和ESLFSREG16 MEM32 从存储器取出4B 送入REG16和FSLGSREG16 MEM32 从存储器取出4B 送入REG16和GS说明 1 LFS LGS只能用于386及其后继机型中 2 不影响标志位 70 例 LDSSI 10H 执行前 DS C000H C0010H 0180H C0012H 2000H执行后 1 地址传送指令LDS LES LFS LGS SI 0180H DS 2000H 71 40H00H00H30H MOVBX TABLEMOVBX OFFSETTABLELEABX TABLELDSBX TABLELESBX TABLE BX 0040H BX 1000H BX 1000H BX 0040H DS 3000H BX 0040H ES 3000H TABLE 1000H TABLE 1 1 地址传送指令LDS LES LFS LGS TABLE 72 格式 CBW 将AL寄存器内容符号扩展成16b 送入AXCWD 将AX寄存器内容符号扩展成32b 送入DX 高位 和AXCWDE 将AX寄存器内容符号扩展成32b 送入EAXCDQ 将EAX寄存器内容符号扩展成64b 送入EDX和EAX 2 扩展传送指令MOVZX MOVSX CBW CWD CWDE CDQ 功能 把8位的操作数扩展为16 32位 或者把16位的操作数扩展为32位 送入目的寄存器 说明 1 CWDE CDQ是386后继机型新增的 2 主要用于有符号数除法之前对被除数位数进行扩展 73 举例 假设有 EAX 00008060HCBWCWDCWDECDQ 2 扩展传送指令MOVZX MOVSX CBW CWD CWDE CDQ AX 0060H DX 0FFFFH AX 8060H EAX 0FFFF8060H EDX 00000000H EAX 00008060H 74 MOVZXREG16 REG32 REG8 MEM8 REG16 MEM16功能 将8 16位寄存器 存储器操作数零扩展 送入16 32位寄存器 MOVSXREG16 REG32 REG8 MEM8 REG16 MEM16功能 将8 16位寄存器 存储器操作数符号扩展 送入16 32位寄存器 举例 设有 AX 8060HMOVZXEBX AXMOVSXEBX AXMOVSXEBX AL EBX 00008060H EBX 0FFFF8060H EBX 00000060H 75 3 交换指令XCHG SWAP 格式 XCHGREG MEM REG MEM功能 交换源 目的操作数的内容 说明 1 可以在寄存器之间或者在寄存器和存储器之间交换信息 2 不允许使用段寄存器 3 不影响标志位 格式 BSWAPREG32功能 交换32位寄存器的最高字节和最低字节 次高字节和次低字节 说明 486后继机型新增指令 76 举例1 寄存器和寄存器交换movax 1234hmovbx 5678hxchgax bxxchgah al举例2 寄存器和存储器交换xchgax 2000h 字交换xchgal 2000h 字节交换xchgeax 2000h 双字交换 3 交换指令XCHG SWAP ax 5678h bx 1234h ax 7856h 77 举例3 EAX 12345678HXCHGAH ALBSWAPEAX AX 7856H EAX 78563412H 3 交换指令XCHG BSWAP 78 4 换码指令XLAT 格式 XLATMEM16功能 以MEM16对应段寄存器为段基址 以BX为偏移地址查表 格式 XLAT AL DS BX AL 功能 用AL寄存器的内容查表 结果存回AL寄存器 表格的首地址事先存放在DS BX中 79 TABLEDB 0123456789ABCDEF PUSHDS 保护DS寄存器内容MOVBX SEGTABLE 取TABLE所在的段基址送BXMOVDS BX 从BX转送入DSLEABX TABLE 取TABLE的偏移地址XLAT 查表 AL 01001011B B POPDS 恢复DS寄存器内容 设 AL 00001011B下面程序执行后 AL中的二进制数改变为对应的十六进制数字符的ASCII代码01000010 B 80 例 若 BX 0040H AL 0FH DS F000H F004F 2CH则执行XLAT指令后 AL 2CH 把AL中的代码0FH转换为2CH BX 0040H AL 0FH 2CH 存储器 DS F000H 数据段 表格 4 换码指令XLAT 81 例 4 换码指令XLAT datasegmenttable1db30h 31h 32hdataendsdsegsegmenttable2db34h 35h 36hdsegends codesegmentassumecs code ds data es dsegstart movax datamovds axmovax dsegmoves axmovbx 0moval 1xlatmoval 1xlattable2movah 4chint21hcodeendsendstart AL 31H AL 35H 82 如何把AL寄存器中的十进制数字转换为ASCII码值 4 换码指令XLAT datasegmenttabledb 0123456789 dataendscodesegmentassumecs code ds datastart movax datamovds axmovbx offsettablemoval 5xlatmovah 4chint21hcodeendsendstart 83 2 2 5堆栈 堆栈 STACK 是用户使用的存储器的一部分 用来存放临时性的数据和其他信息 例如函数使用的局部变量 调用子程序的入口参数 返回地址等 堆栈的段基址必须放在SS中 堆栈段的 栈顶 地址 偏移地址 放在SP寄存器中 84 在SEGMENT伪指令中增加 STACK 表示该段是 堆栈 这个程序装入时 操作系统把SSEG的段基址置入SS 堆栈段的字节数 本例中为200 0C8H 置入SP 1 堆栈段结构 SSEGSEGMENTSTACK 堆栈段开始DW100DUP 大小为100个字SSEGENDS 堆栈段结束 堆栈段的定义 85 从较大地址开始分配和使用 数据段 代码段从较小地址开始分配和使用 由SP中地址指出的存储单元称为 栈顶 数据总是在 栈顶 位置存入 称为 压入 取出 称为 弹出 最先进入的数据最后被弹出 FirstInLastOut FILO 最后进入的数据最先被弹出 LastInFirstOut LIFO 堆栈段的特点 86 压入2B数据的操作SP SP 2SS SP 数据 弹出2B数据的操作目的操作数 SS SP SP SP 2 87 ES DS指向PSP SS指向用户程序区 CS指向用户代码段 由END伪指令指明 SP 0000H 指向64KB存储器尾部 程序规模较小时 可以不定义堆栈段 用户程序装入内存时 88 2 8086CPU堆栈指令 指令的操作数是16b的寄存器 存储器 段寄存器 CS除外 指令执行后 操作数的内容被更新 1 PUSH 压栈 指令 把16b操作数压入堆栈 格式 PUSHREG16 MEM16 SEG 指令的操作数是16b的寄存器 存储器 段寄存器 指令执行后 操作数的内容不变 格式 POPREG16 MEM16 SEG 2 POP 出栈 指令 从堆栈中弹出16b存入操作数 89 例1 把CS寄存器内容存入DSPUSHCSPOPDS例2 子程序中通常利用堆栈保护数据PUSHAXPUSHBXPUSHCX POPCXPOPBXPOPAX 2 8086CPU堆栈指令 90 3 PUSHF指令 把FLAGS寄存器内容压入堆栈 格式 PUSHF 4 POPF指令 从堆栈弹出16b送入FLAGS寄存器 指令执行后 各标志位被刷新 格式 POPF 举例 下面程序段把TF标志位置位 置1 PUSHFPOPAX AX FlagsORAX 0100H 将D8 TF位 置1PUSHAXPOPF Flags AX 91 5 LAHF指令 把FLAGS寄存器的低8位送入AH寄存器 格式 LAHF 6 SAHF指令 把AH寄存器内容送入FLAGS寄存器的低8位 它的执行刷新了SF ZF AF PF CF标志位 格式 SAHF 92 3 扩展的堆栈指令 80386开始的微处理器增设了32b的堆栈指令 PUSHREG32 MEM32 32位寄存器 存储器操作数压入堆栈POPREG32 MEM32 从堆栈弹出32位 送入目的操作数PUSHIMM 16 32位立即数压入堆栈 例1 PUSHEAXPUSHDWORDPTR DI POPECXPOPDWORDPTR SI PUSH0A123H 93 PUSHAD 把8个32位通用寄存器顺序压栈POPAD 从堆栈中弹出8个32b数据顺序存入通用寄存器 80386增加了8个32位通用寄存器的入 出栈指令 顺序同上 80286微处理器增加了在一条指令中把8个通用寄存器压入 弹出堆栈的指令 压入的顺序是 AX CX DX BX SP BP SI DI 注意 这里的SP代表指令执行之前的值 弹出的顺序相反 PUSHA 把8个16位通用寄存器顺序压栈POPA 从堆栈中弹出8个16b数据 顺序存入通用寄存器 上述指令执行都不影响标志位 94 80386开始新增加了压入 弹出32位EFLAGS寄存器指令 PUSHFD 把32位EFLAGS寄存器内容压入堆栈 原寄存器内容不变POPFD 从堆栈中弹出32b 存入EFLAGS 寄存器内容被更新 95 2 2 6操作数表达式 指令中的操作数可以是一个表达式 这个表达式的值在汇编成目标代码的时候进行计算 产生目标代码 例 设变量X的偏移地址为1020H MOVAL X 5 MOVAL 1025H 96 汇编时 对EQU定义的符号名用对应的表达式进行 替换 1 符号定义伪指令 符号名EQU表达式 NUMEQU215MOD15ERR MSGEQU DataOverride MESSAGEDBERR MSGMOVCX NUM 1 例1 有以下定义 等价于MESSAGEDB DataOverride 等价于MOVCX 215MOD15 1 用EQU定义的符号名不允许重复定义 97 POINTEREQUBUFFER DI WTEQUWORDPTR MOVBX POINTERMOVWTPOINTER 0 举例2 有以下定义 等价于MOVBX BUFFER DI 等价于MOVWORDPTRBUFFER DI 0 98 TIMES 0 TIMES TIMES 1 使用 定义符号名时 只能使用常数表达式 而且对一个符号名可以多次定义 一个新的定义出现后 原来定义自动终止 符号定义伪指令 有助于提高程序的可读性和可靠性 先定义 后使用 99 称为 索引运算符 用来括起组成偏移地址的一个分量 各分量相加 得到最后的偏移地址 2 地址表达式 运算符对构成偏移地址的各个分量进行 加 减 操作 存储器操作数X 5产生EA 1025H 指令MOVBL X 10H产生EA 1010H MOVAX 2 BX DI MOVAX BX DI 2 MOVAX BUFFER BX 2 MOVAX BUFFER BX 2 设变量X的偏移地址为1020H 100 3 立即数表达式 立即数表达式在汇编源程序时进行计算 它的结果用作指令中的立即数操作数 这种表达式中的运算对象必须是 已知 的 否则无法进行计算 用于产生立即数操作数的表达式有4类运算符 算术运算符 逻辑运算符 关系运算符 地址运算符 101 1 算术运算符 相加 相减 相乘 整除运算 MOD 取余数 MOD 运算优先级从高到低依次为 可以使用圆括号改变运算顺序 MOVBX 32 13 6MOD3 32 13 6 MOD3 MOVBX 0022H 34 22H 例 102 2 逻辑运算符 SHL SHR NOT AND OR XOR 运算优先级从高到低依次为 SHR 右移 SHL 左移 AND 逻辑与 OR 逻辑加 XOR 异或 半加 NOT 逻辑非 取反 例 ORAL 03HAND45HMOVAL 30SHR1 MOVAL 15 ORAL 01H 103 3 关系运算符 GT 大于 GE 大于或等于 LT 小于 LE 小于等于 EQ 等于 NE 不等于 关系运算符用于两个数的比较 结果为 真 1 或 假 0 MOVAX 6000HGE5000H MOVAX 0FFFFH MOVEAX 3GE2 MOVEAX 00000000H 例 104 4 地址运算符 地址运算符对变量名 标号 地址表达式进行计算 得到作为立即数的运算结果1 SEG取地址表达式所在段的段基址 例 设变量LIST定义在DATA段中 下面三条指令都是把DATA段的段基址装入AX MOVAX DATA DATA代表该段的段基址 是一个立即数MOVAX SEGDATA 取DATA的段基址 结果是立即数MOVAX SEGLIST 取LIST的段基址 结果是立即数 105 XDB ABCDE YDW3DUP 5 4DUP 1 ZDD34 49 18 2 OFFSET取地址表达式的偏移地址 MOVAX LIST 取出变量LIST第一个元素送入AXMOVAX OFFSETLIST 取变量LIST的偏移地址送入AX 3 TYPE LENGTH SIZE三个运算符分别用于取变量或标号的类型 取变量定义时的元素个数 取变量占用的字节数 近程标号的类型为 1 远程标号的类型为 2 例 例 TYPE 1 LENGTH 1 SIZE 1 TYPE 2 LENGTH 3 SIZE 6 TYPE 4 LENGTH 1 SIZE 4 106 上面所有的表达式都必须是汇编期间可以求值的 MOVAX BX 2 是一条错误的指令 汇编时将报告错误 原因在于BX的值是未知的 可变的 在汇编阶段无法进行相关的计算 需要把BX的值与常数2相加并存入AX的操作只能在程序执行阶段由以下两条指令完成 MOVAX BX BX寄存器值存入AX寄存器ADDAX 2 AX寄存器的值加上2 结果存入AX 107 2 3汇编语言上机操作 2 3 1编辑2 3 2汇编2 3 3连接2 3 4运行和调试 108 汇编语言源程序编制完成后 在计算机上的操作过程分为四个阶段 编辑 汇编 连接 运行调试 109 2 3 1编辑 输入源程序 对源程序进行修改 编辑阶段的主要任务是 一定要用 纯文本 格式来储存源程序文件 否则无法汇编 产生的源程序文件应该以 ASM 或 TXT 为扩展名 最好使用 ASM 扩展名 大多数的文字编辑软件都可以用来输入和修改汇编语言源程序 如记事本 Notepad 写字板 Writer Word以及命令行方式下的Edit 110 2 3 2汇编 汇编阶段的任务是把汇编语言源程序 翻译 成为机器代码 称为 目标 产生二进制的 目标文件 常用的汇编工具 Microsoft公司的MASM MacroAssembler 宏汇编 Borland公司的TASM TurboAssembler 假设已经产生了一个汇编语言源程序文件 MYPRG1 ASM 可以用如下命令进行汇编 该命令正确执行后 将产生一个同名的目标文件MYPRG1 OBJ TASMMYPRG1 111 如果汇编语言源程序文件以 TXT 为扩展名 汇编时要使用这个文件的 全称 TASMMYPRG1 TXT Errormessages NoneWaringmessage None TASM命令执行后 在屏幕上显示相关信息 说明这个程序已经顺利地通过了 汇编 没有发现错误 Error EX2 ASM 14 Valueoutofrange Errormessages 1 表示汇编源程序EX2 ASM第14行有 数值超出范围 的错误 程序的错误总数为1 112 ZI产生用于程序调试的完整信息 L产生同名的列表文件 完整的TASM命令行 TASM OPTION SOURCE OBJECT LISTING XREF OPTION 这一部分可以给汇编过程提供一些可选择的项目 常用的选项有 OBJECT 通过这个选项另外指定目标文件名 LISTING 用这个选项指定列表文件的名称 XREF 这个选项用来产生交叉引用文件 113 对源程序 PRG TXT 进行汇编 产生名为 PRG1 OBJ 的目标文件名为 PRG1 LST 的列表文件 同时产生程序调试所需要的完整信息 包含在目标文件中 关于TASM命令更详细的信息 可以打入命令 TASM 获得 TASM ZIPRG TXT PRG1 PRG1 114 2 3 3连接 连接阶段主要完成的操作是 把几个程序模块产生的目标文件连接成一个完整的可执行程序 把 子程序库 中的子程序连接到程序中去 由单个程序文件组成的简单程序 连接命令如下 TLINKEX2 对目标文件 EX2 OBJ 进行连接操作 产生同名的可执行程序 EX2 EXE 如果程序里没有定义堆栈段 连接过程会产生警告信息 Nostack 如果程序比较小 这个警告信息不影响连接产生的可执行程序的使用 115 TLINKMYPRG1 MYPRG2 MYPRG MYLIB 关于TLINK命令更详细的信息 可以打入命令 TLINK 获得 t产生 COM 格式的可执行程序 v产生的可执行程序包含全部的符号调试信息 汇编时已使用过 ZI 选项 否则该选项不起作用 可以在TLINK命令中增加一些选择项 常用的选择项 把目标文件MYPRG1 OBJ MYPRG2 OBJ和子程序库文件MYLIB LIB中的部分子程序连接成为一个可执行程序MYPRG EXE 116 2 3 4运行和调试 由TLINK产生的 EXE 或者 COM 文件可以直接执行 MYPRG1 扩展名 EXE 可以省略 如果同时存在文件MYPGM EXE和MYPGM COM 上面的命令将执行程序MYPRG COM而不是MYPGM EXE 如果同时存在文件MYPGM EXE和MYPGM COM 执行程序MYPGM EXE时 需
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 董事会管理暂行办法
- 乡村振兴背景下2025年人才培育与农村人才队伍建设策略
- 达人短视频管理办法
- 战斗技能测试题及答案
- 风电场设备调试技术方案
- 安全培训类文章标题大全课件
- 低空经济产业园基础设施建设方案
- 幕墙施工安全数字化预警方案
- 幕墙安装数字化定位技术方案
- 钢结构安装精度控制方案
- 露天矿风险告知卡
- winmodv工厂可接受性测试、虚拟调试过程控制实时仿真
- 消费者行为学第01章导论
- 教学课件 金属学与热处理-崔忠圻
- 部编版二年级语文上册全册教案及反思
- 服装色彩设计(PPT57页)课件
- 北师大版五年级数学上册全册教案含反思
- 西门子燃气轮机技术介绍开
- 阅兵英语课件
- F8型空气分配阀及其电空制动机
- 复旦大学简介 ppt
评论
0/150
提交评论