zoukankan      html  css  js  c++  java
  • <汇编语言(第2版)>2011040201

    8086转移指令有以下几类:
        无条件转移指令,eg.jmp
        条件转移指令,eg.jz
        循环指令,eg.loop
        过程
        中断

    操作符offset在汇编语言中是由编译器处理的符号,它的功能是取得标号的偏移地址。
    eg.start:mov ax,offset start

    jmp指令:
    jmp short 标号,实现段内短转移,仅对IP修改,范围是-128~127
    注意,此短转移保存转移的偏移的位移。即(IP)=(IP)+8位位移
    1>8位位移=标号处的地址-jmp指令后第一个字节的地址
    2>short指明此处的位移为8位位移
    3>8位位移采用补码表示,-128~127
    4>8位位移由编译程序在编译时计算

    与此类似的还有
    jmp near ptr 标号,段内近转移-32768~32767,16位位移

    jmp far ptr 标号,实现段间转移,又称远转移,同时修改CS和IP

    jmp 16位reg,修改IP,(IP) = (16位reg)

    jmp word ptr 内存单元地址(段内转移),实际修改IP,(IP) = ([...])

    jmp dword ptr 内存单元地址(段间转移),修改CS和IP,(CS)=([...+2]),(IP) = ([...]),就是说CS用内存单元的高地址。

    jcxz指令:段内短转移
    jcxz 标号
    条件(cx)=0跳转到标号
    所有条件转移指令都是短转移

    loop指令:段内短转移
    loop 标号
    条件(cx) != 0跳转到标号
    所有循环指令都是短转移

    在后续的试验8中,出现一个nop指令
    nop指令的作用是什么,通过nop指令的填充(nop指令一个字节),使指令按字对齐,从而减少取指令时的内存访问次数。(一般用来内存地址偶数对齐,比如有一条指令,占3字节,这时候使用nop指令,cpu 就可以从第四个字节处读取指令了。) baidu了一下,发现有许多答案:

    1)通过nop指令产生一定的延迟,但是对于快速的CPU来说效果不明显,可以使用rep前缀,多延迟几个时钟;-->具体应该说是占用了3个时钟脉冲!
    2)i/o传输时,也会用一下 nop,等待缓冲区清空,总线恢复;
    3)清除由上一个算术逻辑指令设置的flag位;
    4)破解:)对于原程序中验证部分使用nop来填充,使验证失效;
    5)有一个朋友说的比较厉害--在航天飞机控制程序中防止程序跳飞!
    解释如下:在空间放射性环境下,放射性子粒很容易使内存位元改变(呵呵,有点基因突变的感觉),这样如果改变的是jump,call指令的存贮位置的话,就会导致程序跳转到一个不可以预置的位置,对于关键系统来说的确是灾难性的。所以就在被调用程序之前填充nop指令,这样即使跳转到稍前或者稍后的位置,也不会造成影响。
    这样我想起"C tarp and fitfall"中举的那个导弹软件中的致命错误:因为导弹是以0.1s为单位进行记时的,但是由于浮点数没有办法精确的表示0.1,造成了舍尾误差,这个误差在导弹开启3天的之后逐渐的积累,结果误差了一秒。
     

    nop说明转自:http://blog.163.com/tianhail@126/blog/static/14039591520103137230514/

  • 相关阅读:
    mysql锁表与解锁
    问题汇总
    安装一台Centos7桌面版的跳板机
    Centos7二进制部署k8s-v1.20.2 ipvs版本(部署mysql、nacos)
    Centos7二进制部署k8s-v1.20.2 ipvs版本(Prometheus监控k8s)
    CV2 安装异常
    PostgreSQL VACUUM 没有效果(无法清理死元组)的原因
    SQL Server 进程运行状态解析
    mysql 几种启动和关闭mysql服务的方法和区别
    MySQL学习(九)小结(转载)
  • 原文地址:https://www.cnblogs.com/GoGoagg/p/2003353.html
Copyright © 2011-2022 走看看