No.3汇编进阶

目录

1.栈操作指令

2.算术逻辑运算指令

3.跳转与条件传送

3.1跳转指令

3.2有条件传送

4.循环指令


1.栈操作指令

●压栈:push

●出栈:pop

栈顶朝着0地址方向增长,寄存器esp储存栈顶地址:

1).pushw $0x88888888

该指令表示将一个两字节大小的值入栈,但是0x88888888占四个字节,该操作的结果是将0x88888888高四位的值舍弃,使其变为两个字节大小(0x8888),再将其入栈。

2).pushw value

此处value为地址,该指令表示将value后两个字节的值入栈。

3).push $value

将value的地址入栈。

4).popl %ebx

弹出四个字节的数据写入ebx。

push与pop是两个独立的操作,互不干扰。比如入栈时一次性压入四个字节的数据,出栈时可以两个两个的弹出或者以其他方式弹出。

2.算术逻辑运算指令

3.跳转与条件传送

3.1跳转指令

寄存器eip储存下一条指令的地址。

●直接跳转:jmp

●条件跳转指令:

▲条件在寄存器eflags中:

名称

作用

在eflags中位置

SF

符号位

第7位

ZF

零标志位

第6位

CF

进位或借位

第0位

OF

溢出

第11位

例:四位数字运算:

无符号数,最小为0000(0),最大为1111(15)

有符号数,最小为0000(-8),最大为0111(7)

x=1010(10或-6),y=0111(7)

x-y=1010 – 0111=0011(3)

ZF=0 结果不是零

CF=0 做无符号数减法时没有借位

SF=0 结果的第一位为0

OF=1 做有符号数减法时有溢出

OF位的计算:

计算机在计算时采用双符号位,在有符号数前补一个数,使其前两个数变成11/00,计算结果中,如果前两位为10/01,则有溢出;前两位为11/00则无溢出。eg:11010 – 00111=10 011 符号不是00或11

▲条件跳转指令集:

  

3.2有条件传送

●标志位指令:满足条件则设置相关寄存器的值。

●有条件传送:满足条件才执行传送

●条件码相关知识:

incdec指令不影响进位标志位,而add $1,%eax与sub $1,%eax等指令会影响进位标志位。

cmp指令是对两个数做减法,但不保留结果,仅根据结果设置标志位。

test指令对两个操作数做逻辑与(按位与)运算,但不保留结果。

testl $0x4,%eax #0x4=00000000 00000000 00000000 00000100

jnz #如果此例中eax的倒数第三个bit为1,则跳转。

testl %ecx, %ecx

jz #如果ecx为零,则跳转。

▲对于CF标志位,有三条专门的指令:

clc:将CF标志位清零

stc:将CF标志位设置为1

cmc:将CF标志位置反 

4.循环指令

循环用两种方式实现:

1).条件跳转指令

2).loop指令

在遇到loop指令时,会判断ecx中的值是否为0,不为0则跳转至指定位置,每跳转一次ecx的值自动减一,当该值为0时跳出循环。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值