第3章 80x86指令系统和寻址方式研究.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
3. 循环指令 循环指令 LOOP 语句格式: LOOP 短标号 执行过程:如果(CX)≠0,转向“标号”所指向的指令,否则,终止循环,执行该指令下面的指令。 说 明:使用LOOP指令可代替两条指令: DEC CX JNE 短标号 CX←循环次数 循环体 CX← CX-1 CX=0? Y N 相等/为零循环指令 LOOPE/LOOPZ 语句格式: LOOPE/ LOOPZ 短标号 执行过程: (1)(CX)=(CX)-1(不改变任何标志位) (2)如果CX≠0且ZF=1,则程序转到循环体的第一条指令,否则,程序将执行该循环指令下面的指令。 CX←循环次数 循环体 CX← CX-1 CX0且ZF=1? No Yes 不相等/不为零循环指令LOOPNE/LOOPNZ 语句格式: LOOPNE/ LOOPNZ 短标号 执行过程: (1)(CX)=(CX)-1(不改变任何标志位) (2)如果CX≠0且ZF=0,则程序转到循环体的第一条指令,否则,程序将执行该循环指令下面的指令。 CX←循环次数 循环体 CX← CX-1 CX0且ZF=0? No Yes 例:记录字符串中的空格个数到 RESULT单元。 MOV CX,COUNT ;设置循环次数 MOV SI,OFFSET STRING XOR BX,BX ;BX清0,用于记录空格数 MOV AL,20H ;空格的ASC码为20H AGAIN: CMP AL,ES:[SI] JNZ NEXT ;ZF=0,非空格,转移 INC BX ;ZF=1,是空格,个数加1 NEXT: INC SI LOOP AGAIN ;字符个数减1,不为0继续循环 MOV RESULT,BX ;保存结果 4. 子程序 子程序是完成特定功能的一段程序。如果某程序段在源程序内反复出现,就可把该程序段定义为子程序。这样可以缩短源程序长度、节省目标程序的存储空间,也可提高程序的可维护性和共享性。 当主程序(调用程序)需要执行这个功能时,采用 CALL 调用指令转移到该子程序的起始处执行; 当运行完子程序功能后,采用 RET 返回指令回到主程序继续执行。 CALL label … … … label: proc … RET 主程序 子程序 … 子程序调用指令 CALL 类似JMP指令, CALL指令分成4种类型: CALL label ;段内调用、直接寻址(段内直接调用) CALL r16/m16 ;段内调用、间接寻址(段内间接调用) CALL far ptr label ;段间调用、直接寻址(段间直接调用) CALL dword ptr mem ;段间调用、间接寻址(段间间接调用) 但不同于JMP指令,CALL指令需要保存返回地址: 段内调用——入栈偏移地址IP: SP←SP-2,SS:SP←IP 段间调用——入栈偏移地址IP和段地址CS: SP←SP-2,SS:SP←IP; SP←SP-2,SS:SP←CS。 (1)段内直接调用 格 式:CALL DST 执行步骤:① 将子程序的返回地址存入堆栈,以便子程序返回使用。 即: (SP)←SP - 2;(SP)+1,(SP)←IP  ② 转移到子程序入口地址去继续执行子程序。指令中的DST在汇编格式指令作用子程序入口地址的符号地址(标号)。在机器语言中,它是一个16位的偏移量。即: (IP)←IP+ D16 注:段内调用只改变IP,不改变CS的值。 SS→ 堆栈段 SP-1 → SP→ IP高位字节 IP IP低位字节 SP-2 → ① ② ③ ④ (2)段内间接调用 格 式:CALL DST 此指令的执行步骤和段内直接调用大致相同,主要区别是

文档评论(0)

1112111 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档