汇编语言程序设计_2_3.ppt_第1页
汇编语言程序设计_2_3.ppt_第2页
汇编语言程序设计_2_3.ppt_第3页
汇编语言程序设计_2_3.ppt_第4页
汇编语言程序设计_2_3.ppt_第5页
已阅读5页,还剩51页未读 继续免费阅读

下载本文档

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

文档简介

汇编语言程序设计AssemblyLanguageProgramming 8086 8088的寻址方式和指令系统2 2指令系统 IBMPC机的指令系统 8086 8088指令系统分成下列六大类 数据传送指令算术运算指令逻辑运算和移位指令串操作指令CPU控制指令与标志位处理指令控制转移指令 逻辑非指令 NOTOPR OPR不能为立即数执行操作 OPR OPR 不影响标志位功能 按位取反逻辑与指令 ANDDST SRC执行操作 DST DST SRC 用途 用于屏蔽一个数的某些位 逻辑或指令 ORDST SRC执行操作 DST DST SRC 用途 用于置位一个数的某些位 异或指令 XORDST SRC执行操作 DST DST SRC 用途 将一个数的某些位取反 测试指令 TESTOPR1 OPR2执行操作 OPR1 OPR2 用途 用于屏蔽一个数的某些位 逻辑运算指令 ANDVSTEST AND具有破坏性 TEST没有AL 0FFHANDAL 0TESTAL 0同SUB和CMP 例 屏蔽AL的0 1两位ANDAL 0FCH例 置AL的第5位为1ORAL 20H例 使AL的0 1位变反XORAL 3例 测试某些位是0是1TESTAL 1JZEVEN 例子 一 例子 二 将AL的低4位清0 最高位取反 次高位变为1 其它3位不变ANDAL 0F0HORAL 40HXORAL 80H 移位指令 分类 逻辑SHL SHR算术SAL SAR循环ROL ROR带进位循环RCL RCR共同特点都是按位进行当移动的位数为一位时 用立即数1 当移动二位或二位以上时 要预先将移动的位数存放在CL中 SHLAL 2 MOVCL 2 SHLAL CL 格式 SHLDst Src功能 将Dst的内容左移1 n位 右边添0 说明 Dst reg mem Src 1或CL注意 逻辑左移1位等价于将一个无符号数乘以2 格式 SHRDst Src功能 将Dst的内容右移1 n位 左边添0 注意 逻辑右移一位等价于将一个无符号数除以2 整除 逻辑SHL SHR 算术SHL SHR 算术左移SAL 同逻辑左移SHL 格式 SARDst Src功能 将Dst的内容右移1 n位 最高位不变注意 算术右移一位等价于将一个带符号数除以2 整除 循环移位指令 循环左移ROLDst Src循环右移RORDst Src 带进位循环RCL RCR 带进位循环左移RCLDst Src带进位循环右移RCRDst Src 例子 一 移位指令的用途 运算 测试某些位 遍历字节位 字节数据变形RCL和RCR常用在多字节数的移位 在DX和AX中存放着一个32位数据 试将其左移1位 SHLAX 1RCLDX 1 AX 0012H BX 0034H 把它们装配成 AX 1234HMOVCL 8ROLAX CLADDAX BX BL 80H 1 BL 为无符号数 求 BL 2SHRBL 1 BL 40H 2 BL 为带符号数 求 BL 2SARBL 1 BL 0C0H 例子 二 例子 三 把 BL 中的8位数高低4位互换MOVDL BLMOVCL 4SHRBL CLSHLDL CLORBL DLMOVCL 4ROL RORBL CL 例子 四 比较移位指令CL 8SHLAL CLSHRAL CL 4 串操作指令 REP REPZ REPNZMOVSLODSSTOSCMPSSCAS 串操作 处理字符串 缓冲区B BYTE W WORD寄存器 DS SI 存放源串的地址ES DI 存放目标串的地址CX 存放串的长度AL AX 存放关键字方向标志 DF 0 执行串指令时 对SI DI进行加1 2操作 DF 1 执行串指令时 对SI DI进行减1 2操作 设置方向标志 CLD 0 DFSTD 1 DF 重复操作前缀 REP串指令 若 CX 0 重复执行串指令 CX 1 REPZ REPE串指令 若 CX 0且 ZF 1 重复执行串指令 CX 1 REPNZ REPNE串指令 若 CX 0且 ZF 0 重复执行串指令 CX 1 MOVS 格式 MOVSDst Src 字或字节传送 Dst Src必须有一者指明传送的大小 如 movswordptr di si MOVSB 字节传送MOVSW 字传送功能 DS SI处的一个字节 字送入ES DI ifdefMOVSB defineSIZE1BYTEPTRES DI BYTEPTRDS SI else defineSIZE2WORDPTRES DI WORDPTRDS SI endifif DF 0 SI SIZE DI SIZE else SI SIZE DI SIZE MOVS 使用 MOVS 指令要做的准备工作 源串的首地址 偏址 SI 目标串的首地址 偏址 DI 设置方向标志重复MOVS指令 REPMOVSBREPMOVSW上述指令的执行过程 若 CX 0 则退出该指令的执行 否则执行b CX 1 CX 执行一次MOVSB或MOVSW 返回a 使用 REPMOVS 指令前将串的长度 CX LODS指令 格式 LODSSrc SI AL AXLODSWORDPTR SI LODSB SI ALLODSW SI AX功能 ifdefLODSB defineSIZE1AL DS SI else defineSIZE2AX DS SI endifif DF 0 SI SIZE else SI SIZE NOTICE 使用 LODS 指令要做的准备工作 源串的首地址 SI 设置方向标志LODS指令一般不加 重复前缀 LODS用于从字符缓冲区中逐次取出字符的情况 STOS指令 格式STOSSrc stoswordptr di STOSB STOSW 功能 AL AX送入ES DI ifdefSTOSB defineSIZE1ES DI AL else defineSIZE2ES DI AX endifif DF 0 DI SIZE else DI SIZE STOS 使用 STOS 指令要做的准备工作 目的串的首地址 DI 设置方向标志若执行 REPSTOS 指令 用同一个数据来初始化一个缓冲区 Main 函数反汇编代码分析pushebpmovebp espsubesp 76 0000004cHpushebxpushesipushedileaedi DWORDPTR ebp 76 movecx 19 00000013Hmoveax 858993460 ccccccccHrepstosd SCAS 格式 SCASDst 字或字节扫描SCASB 字节扫描SCASW 字扫描功能 AL AX ES DI 的结果特征 ZF等标志位 ifdefSCASB defineSIZE1CMPAL ES DI else defineSIZE2CMPAX ES DI endifif DF 0 DI SIZE else DI SIZE 重复SCAS指令 REPNZSCASB 查找AL中的字符 REPNZSCASW 查找AX中的字符 上述指令的执行过程 若 CX 0且 ZF 0 则执行b 否则退出该执行 CX 1 CX执行SCASB或SCASW返回a 使用 REPNZSCAS 指令要做的准备工作 目标串的首地址 DI 串的长度 CX 要查找的关键字 AL或AX 设置方向标志 CMPS指令 格式 CMPSDst Src 字或字节比较CMPSB 字节比较CMPSW 字比较功能 ES DI DS SI 的结果特征 ZF等标志 ifdefCMPSB defineSIZE1CMPBYTEPTRES DI BYTEPTRDS SI else defineSIZE2CMPWORDPTRES DI WORDPTRDS SI endifif DF 0 SI SIZE DI SIZE else SI SIZE DI SIZE 重复CMPS指令 REPZCMPSB 比较两个字符串不相同的地方 REPZCMPSW上述指令的执行过程 若 CX 0且 ZF 1 则执行b 否则退出该指令 CX 1 CX 执行CMPSB或CMPSW指令 返回a 使用 REPZCMPS 指令要做的准备工作 源串的首地址 SI目标串的首地址 DI串的长度 CX设置方向标志 总结 重复前缀指令 REP只能用在MOVS LODS和STOS之前REPZ和REPNZ只能用在CMPS或者SCAS之前 REPZCMPS 找两个字符串不同的地方 REPZSCAS 在字符串中查找某一个不同的字符 REPNZCMPS 找两个字符串第一个相同的字符 REPNZCMPS 在字符串中查找某一个的字符 Example 在BLOCK缓冲区中间存放有100个学生的名字 每个名字占用8个字节 名称用一个空格隔开 试查找是否有 JackChen 这个名字 找到置AL为1 否则置AL为0 ADDDX 9MOVSI DXMOVDI BXDECAHJNZAGAINMOVAL 0FOUND MOVAL 1 string1db abcdefghJackChenlalalala string2db JackChen LEASI STRING1LEADI STRING2MOVDX SIMOVBX DIMOVAH NAGAIN MOVCX 8REPZCMPSBCMPCX 0JZFOUND CLCCF 0CMCCF CFSTCCF 1CLDDF 0STDDF 1CLIIF 0STIIF 1注意 只影响本指令指定的标志 5 处理机控制指令 NOP 空操作 机器码 90H 与XCHGAX AX相同用途 Timer1个时钟周期 DSP C51PlaceHolder一个字节 6 控制转移指令 无条件转移指令转移寻址方式条件转移指令子程序调用和返回指令中断指令 6 1无条件转移指令 格式 JMP地址表达式功能 使程序的流程无条件跳到转移地址所指的地方 例如 JMP1000HJMPBXJMPNEXT 变量 一个数据单元的地址 数据指针 BYTEWORDD 标号 一个指令单元的地址 指令指针 NEARFAR 6 2转移寻址方式 四种转移寻址方式是用来描述转移地址的给出的方式 转移目的地址 CS 16 IP 段内转移 改变IP的内容 CS的内容不变 段间转移 IP CS的内容都改变 段内直接寻址 指令中直接给出到达的目标地址例如 JMPPROG1 转移范围 32768 32767JMPSHORTNEXT 转移范围 128 127JMP1000H段内间接寻址 指定某个寄存器的内容或某个字单元的内容作为转移地址的偏移地址 例如 JMPBX BX IPJMPWORDPTR 1000H DS 1000H IPJMPWORDPTR SI 2 DS SI 2 IPJMPTABLE BX DS TABLE BX IP段间直接寻址 通过标号直接给出转移地址例如 JMPFARPTRNEXTP NEXTP的段址 CS 偏址 IPJMPNEXTP1 NEXTP1的段址 CS 偏址 IP段间间接寻址 指定一个4字节的单元内容作为转移地址 其中低二字节内容 IP 高二字节内容 CS 例如 JMPDWORDPTR 100H JMPDWORDPTR BX 6 3条件转移指令 6 3 1标志位条件转移指令JC标号 当 CF 1 则转移 JNC标号 当 CF 0 则转移 JZ JE标号 当 ZF 1 则转移 JNZ JNE标号 当 ZF 0 则转移 JS标号 当 SF 1 则转移 JNS标号 当 SF 0 则转移 JO标号 当 OF 1 则转移 JNO标号 当 OF 0 则转移 JP标号 当 PF 1 则转移 JNP标号 当 PF 0 则转移 6 3条件转移指令 6 3 2二个无符号数比较转移指令设A为被减数 B为减数 CMPA BJA标号 当A B时转移 JAE标号 当A B时转移 JB标号 当A B时转移 JBE标号 当A B时转移 CFZF 6 3条件转移指令 6 3 3二个带符号数比较转移指令JG标号 当被减数大转移 JGE标号 当被减数大于等于减数转移 JL标号 当被减数小转移 JLE标号 当被减数小于等于减数转移SFOFZF 6 3条件转移指令 6 3 4JCXZ条件转移指令格式 JCXZ标号功能 当 CX 0时 转向标号 例子1 完成分段函数 1AL0 6 3条件转移指令 6 3 5循环控制指令LOOP LOOPE LOOPNE不影响标志位 短转移格式 LOOP标号 功能 CX 1 CX 若 CX 0 则转移功能等价DECCXJNZ标号格式 LOOPE LOOPNE CX0 and ZF 1 0 PUSHFDECCXPOPFJCXZOVERJMP标号OVER 例子2 找出100个有符号字节数中间的最大数 code1segmentmainprocfar callsub retmainendpcode1endscode2segmentsubprocfar retsubendpcode2ends 段间调用和返回 子程序调用和返回 段内 段间 6 4子程序调用和返回指令 调用指令CALL格式 CALL子程序 地址表达式功能 保护断点 将当前断点压入堆栈 转入子程序 将子程序段的入口地址送入IP CS 段内直接调用CALLSubx执行过程 PUSHIP Subx入口地址 IP段内间接调用 子程序的入口偏移地址存放在Reg或者Mem中CALLBXCALLWORDPTR 1000H 执行过程 PUSHIP 子程序入口地址 IP段间直接调用CALLSubf或CALLFARPTRSubf执行过程 PUSHCS PUSHIP 子程序入口地址 CS IP段间间接调用 子程序入口段地址和偏移地址存在DWORD中CALLDWORDPTRADDR执行过程 PUSHCS PUSHIP ADDR IP ADDR 2 CS 子程序返回指令RET格式 RET n 功能 返回主程序 根据子程序的属性Near Far决定 段内返回 POPIP段间返回 POPIP POPCSRETn 返回 并执行SP SP n CALL与RET类型必须一致 例子3 用Debug程序来分析CALL和RET指令SUB MOVAX 1RETCALLSUB 6 5中断调用与返回指令 中断 数据传输方式 软中断和硬中断中断服务程序 处理中断的子程序 中断向量 中断子程序的入口地址中断向量表 存放在00000H地址的四字节表格中断类型码 给中断向量的一个编

温馨提示

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

评论

0/150

提交评论