loop指令
loop系列的指令有:loop,loope/loopz,loopne/loopnz,它们都是借助于ECX寄存器作为计数来实现循环,每轮循环先ecx自动减1,再来判断ecx值,ecx的自减不会影响OF和CF。通用的格式是
loopx lab
- loop
- 循环直到ecx为0。
- 一个错误的例子:
.section .data
output:
.asciz "array[%d]:%d\n"
array:
.int ,,,,,,,,,
.section .text
.globl main
main:
nop
/**
** 一个错误的例子,ecx在printf中被重写
**/
/* movl $, %ecx
Loop1:
#pushal
pushl array(,%ecx,)
pushl %ecx
pushl $output
call printf
addl $, %esp
#popal
loopne Loop1
*/
pushl $
call exit
在loop循环中调用其他函数极易重写ecx的值,这样一来循环被破坏,这点要特别注意。
- loope/loopz
- 循环直到ecx不为0,2个指令无任何区别
- loopne/loopnz
- 循环直到ecx为0,2个指令无任何区别
这样看来,loop ,loopne/loopnz这3个指令好像都是一回事,先看下面的代码:
这段代码是一个简单的求和代码
.section .data
output:
.asciz "sum:%d\n" .section .text
.globl main
main:
nop
/*清掉EFLAGS中的ZF*/
movl $, %eax
addl $, %eax movl $, %ecx
movl $, %eax
loop1:
addl %ecx, %eax
loop loop1
#loopne loop1
pushl %eax
pushl $output
call printf
addl $, %esp pushl $
call exit
如果采用17行loop作为循环条件,ecx自减1,为-1,不为0,那么继续循环,也就是从0xFFFFFFFF---->0x0,结果是:
sum:-2147483648
如果采用18行loopne,结果是:
sum:0
细看loop:Loop until the ECX register is zero
loopne/loopnz:Loop until either the ECX register is zero, or the ZF flag is set
loopne/loopnz 多了一个条件,ZF也影响其判断。代码中虽然ecx在执行18行时,先ecx自减,为-1,但是同时16行代码导致ZF被置位,所以依旧执行了跳转。
loope/loopz也判断了ZF。
loop指令的更多相关文章
- 汇编语言-[BX]和loop指令
汇编语言-[BX]和loop指令 [BX]指令介绍 mov ax,[bx] 功能: bx为偏移地址,段地址默认为ds.因此,上面指令作用就是将ax中的数据送入内存ds:bx处,即:((ds)*16 + ...
- [汇编学习笔记][第五章[BX]和loop指令]
第五章[BX]和loop指令 前言 定义描述性符号“()”来表示一个寄存器或一个内存单元的内容,比如: (ax)表示ax中的内容,(al)表示al的内容. 约定符号ideta表示常量. 5.1 [BX ...
- 80806汇编(5)——[BX]和Loop指令
80806汇编(5)--[BX]和Loop指令 已经好久没写点东西了,国庆节就一直想弄个个人网站,这段时间一直在弄那个,虽然有现成的框架(Hexo),但是总想弄出自己的效果来,但是最后还是有些差强人意 ...
- [bx]和loop指令
body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...
- 汇编-5.0-[BX]和loop指令
1.要完整的描述一个内存单元,需要两种信息:1.内存单元的地址:2.内存单元的长度(类型). 2."()"表示一个寄存器或一个内存单元中的内容.如:(ax)表示ax中的内容. &q ...
- 第五章 [BX]和loop指令
5.1 [bx] [bx]是什么 和 [0] 有些类似,[0] 表示内存单元,它的偏移地址是 0. 例如: mov ax, [0] 内存以字节为单位:ax以字(16bit = 2Byte)为单位:al ...
- 汇编:汇编语言实现冒泡排序(loop指令实现)
;=============================== ;循环程序设计 ;loop指令实现 ;冒泡排序 ;for(int i=0;i<N;i++){ ; for(int h=0;j&l ...
- 汇编程序45:检测点13.2 (loop指令的中断例程)
安装程序: assume cs:code //loop指令的替代实现 code segment start: mov ax,cs mov ds,ax mov si,offset sub1 mov ax ...
- 汇编语言-[bx]和loop指令和多个段
5.1 [BX]和内存单元的描述 要完成描述一个内存单元,需要两种信息: 内存单元的地址: 可以用 [0] 表示一个内存单元, 0 表示单元的偏移地址,段地址默认在 ds 中: 同样也可以用 [bx] ...
- 小甲鱼零基础汇编语言学习笔记第五章之[BX]和loop指令
这一章主要介绍什么是[BX]以及loop(循环)指令怎么使用,loop和[BX]又怎么样相结合,段前缀又是什么鬼,以及如何使用段前缀. 1.[BX]的概念 [BX]和[0]类似 ...
随机推荐
- C#怎样处理xml文件的大于号和小于号等常用符号(xml符号引发的程序错误)
在程序中由xml配置而成的sql语句要转换为C#支持的sql语句 <settings> <select> a.*</select> <from> (se ...
- 回文串---Best Reward
HDU 3613 Description After an uphill battle, General Li won a great victory. Now the head of state ...
- jdbcTemplate 泛型 查询
1. dao层方法使用泛型 public <T> List<T> findDistinctListByCondition(String str, Class<T> ...
- javascript indexOf startWith
判断字符串是否以XX开头 1.切割转换 var str = "ababaa",tags = jquery.trim(str); 2. indexOf方法运行 !tags.i ...
- 自定义HttpMessageHandler实现HTTP方法的重写
自定义HttpMessageHandler实现HTTP方法的重写
- java微信开发(wechat4j)——得到微信请求参数
微信平台会在请求的post数据中带有一些参数,例如用户的openid之类的信息,当你使用了wechat4j之后,得到这些信息是非常方便的. public class Lejian extends We ...
- Play 内置模板标签(1.2.3版本)http://www.anool.net/?p=617
a标签: 用来插入一个连接到控制器方法的html link.如下: #{a @Application.logout()}Disconnect#{/a}模板内容被解析后变成: <a href=&q ...
- 软件快速开发平台 JEPF
JEPF新一代软件快速开发平台(Java Elephant Platform)是一款优秀的平台产品,它本着灵活.快捷开发.高性能.高协作性.高稳定性.高可用性.人性化的操作体验为设计宗旨历经2年研发成 ...
- [ html canvas 透明度 globalApha ] canvas绘图属性 透明度 globalApha 属性演示
<!DOCTYPE html> <html lang='zh-cn'> <head> <title>Insert you title</title ...
- 安卓开发_浅谈OptionsMenus(选项菜单)
Android平台下所提供的菜单大体上可分为三类:选项菜单.上下文菜单和子菜单. 当Activity在前台运行时,如果用户按下手机上的Menu键,此时就会在屏幕低端弹出相应的选项菜单.但这个功能需要开 ...