CSAPP读书随笔之一:为什么汇编器会将call指令中的引用的初始值设置为-4

  CSAPP,即《深入理解计算机系统:程序员视角》第三版,是一本好书,但读起来确需要具备相当的基本功。而且,有的表述(中译文)还不太直白。

  比如,第463页提到,(对于32位系统)为什么汇编器会将call指令中的引用的初始值设置为-4。其后解释语焉不详。结合文中对代码计算公式的展开:

*refptr = (unsigned) (ADDR(r.symbol) + *refptr - refaddr)

= (unsigned) (0x80483c8        + (-4)     - 0x80483bb)

= (unsigned) (0x9)

依然一头雾水。

  其实,这里只要反过来推算,就很好理解了。下图是重定向完成后的内存映象:

0x80483b4    .text

...

0x80483ba    call 80483c8<swap>    ; e8 09 00 00 00

0x80483bb --

0x80483bf    (下一条指令)

...

0x80483c8    swap()

...

  有题如下:

  已知:.text节重定位于0x80483b4,相应地call调用则位于0x80483ba,而swap()函数重定位于0x80483c8。

  求:重定位后,call指令的操作码(即书中所谓“重定位引用”)应当是几?(亦即swap函数相对于call指令执行时PC的偏移是多少?)

  首先说答案,swap函数相对于call指令执行时PC的偏移是0x9,即call指令的完整机器码是 e8 09 00 00 00。

  为什么呢?因为当执行call指令时,PC值已是下一条指令的地址即0x80483bf。为了完成call调用,要把PC值加上call的操作数,结果作为新的PC值。也就是 0x80483bf + 0x9 = 0x80483c8,正好是swap()函数的地址。

  接下来说说,call指令中的引用的初始值-4是做什么用的。我把前面的公式变形:

*refptr = (unsigned) (ADDR(r.symbol) + *refptr - refaddr)

= (unsigned) (ADDR(r.symbol) + (*refptr - refaddr))

= (unsigned) (0x80483c8        + (-4      - 0x80483bb))

= (unsigned) (0x80483c8        -0x80483bf)

= (unsigned) (0x9)

  可以看到,-4就是为了从call指令中操作数本身的地址转换为下一指令的地址而设置的。对于32位机器来说,call指令长5字节,操作码1个字节,而操作数正好占4字节。call指令位于0x80483ba,操作数位于0x80483bb,再过4字节就正好是下一条指令的地址。

  那为什么用-4而不是+4呢?其实很简单,这和链接程序采用的计算公式有关。

  

时间: 2024-10-10 10:04:47

CSAPP读书随笔之一:为什么汇编器会将call指令中的引用的初始值设置为-4的相关文章

CSAPP 读书笔记 - 2.31练习题

根据等式(2-14) 假如w = 4 数值范围在-8 ~ 7之间 2^w = 16 x = 5, y = 4的情况下面 x + y = 9 >=2 ^(w-1)  属于第一种情况 sum = x + y = 9- 2^w  = –7 sum – x == y? -7 – 4 = – 11 属于第三种情况 负溢出 sum – x  = –7 - 4= –11 + 2^w = 5  = y? 明显是等于的 同样 sum- y = x ? -7 – 5 = –12 + 2^w = 4 = x? 所以溢

【csapp读书笔记3】x86 Assembly Language

这部分其实没什么好笔记的...毕竟和课本上的x86汇编是一样的 不过有需要pay attention的地方就是x86汇编有两种书写形式:Intel format和AT&T format (csapp  Page200) Intel format:就是常见于Microsoft和Intel的文档中.另外中国的教材也用这种format AT&T format:csapp就用的这种.另外gcc.objdump等工具反编译的代码默认也是这种格式 主要区别就是操作数中source和destinatio

【csapp读书笔记二】关于整数和浮点数的日常

PART I: Integer There are two types of integer : unsigned integer(only positive) & signed integer(positive,negative and 0)So how does a computer storage an integer? 1.Regarding unsigned integer: CPU use binary to represent unsigned integer directly.e

数学之美读书随笔

最近在读吴军的<数学之美>,书里很多内容之前已经略有了解,这次有了新体会,随手记下,算是开卷有益吧. --20160701 1. Hidden Markov Model 从对(相对静态的)随机变量的研究发展到对随机变量的时间序列S1,S2,S3..., 即随机过程(动态的)的研究. 2.   信息的作用 消除不确定性.也就是说,收集更多的相关信息,可以得到更明确的结论. joint probability:X和Y一起出现的概率 conditional probability:在Y取不同值的前提

【CSAPP读书笔记1】

我们都知道在计算机中一切信息都是由二进制码0010101010111之类的东西表示的.但是这一串01本身其实是没有任何意义的.只有通过各种编码算法encode起来才能给它赋予生命. 在学习计组的时候经常会需要拿出一段二进制编码进行分析.但是这一堆000111之类的写出来实在是太长了....其实用十六进制就可以很简约地表示二进制,而且它们之间的转化异常简单. 比如:0x5F3759DF就对应二进制数 101 1111 0011 0111 0101 1001 1101 1111 仔细看看有什么规律呢

《梦断代码》第0章读书随笔

<<梦断代码> 产品开发? 向我们展示了硅谷一流然间开发者是如何尽心产品开发的,把真实的认识结束以及产品的发展过程结合在一起,每个有志于开发畅销产品的程序员都知道的耐心去品味这个古树. 组织好开发者 天才们在一起合作,貌似创意无穷,实则合力有限,貌似独当一面,实则整合艰难.真正的领导者,实际上早已被要求有着话不可控为可控.化不同愿景为共同愿景.激发天才们最大潜能的能力. 本书提出问题讲出故事. 计算机发展的50年中,作者以自己的亲身经历,写出了所遇到的所有的事情,虽然历经磨难,但是荏苒分

大道至简---读书随笔2

看到团队管理的时候,他告诉我,有时候团队是可以不管理的,不是放任不管,但你还没有熟悉这个团队的时候,想改变他们是非常困难的,他们就像蚂蚁一样辛勤工作着,不要去打扰他们,看看他们是如何去做的,发现规律,分析规律,然后才可以尝试去改变和管理他们. 当有了团队的时候,首要的问题就是“先分工”,书里谈到了弹性分工,被“弹性分工”的员工需要快速转换到新的角色,或许你是个技术开发人员,突然把你调到市场部,但是你根本不懂经营与管理,每个人都会郁闷,会担心自己做不好,但是,只要你想做就能做好它,转换思想,把自己

javascript读书随笔 1

1.1 jQuery 的 noConflict 1 var _jQuery=window.jQuery //window.jQuery可能是别的库的变量名,先用jQuery对象中的临时变量存下来---var _jQuery 2 _$=window.$ //同上 3 jQuery.extend({ 4 noConflict:function(deep){ 5 window.$=_$; 6 if(deep){ //如果jQuery是需要深度让出全局变量名时,将noConflict函数传入一个参数,只

程序员修炼之道---读书随笔1

终于开始读<程序员修炼之道>这本书了,初看这本书的名字,有点以前的道士修炼法术的意思,觉得很是好奇,作为一名程序员,该如何修炼我们自己呢? 这本书涵盖的主题从个人责任.职业发展,直到用于使代码保持灵活.并且易于改编和复用的各种架构技术.利用许多富有娱乐性的奇闻轶事.有思想性的例子 以及有趣的类比,全面阐释了软件开发的许多不同方面的最佳实践和重大陷阱. 编程技术就是程序员的手艺,你的程序就是你的艺术品.时刻关注自己的技艺,保持热情.保持好奇,争取做到富有专长而又多才多艺.有人说过这样一句话:“