cc编译器生成的unix v6汇编代码的含义是什么?

时间:2017-04-02 02:36:51

标签: unix cc pdp-11

例如,下面是cc编译器生成的一段C代码及其汇编代码。

Monad

我可以理解大部分代码。但我不知道// C code (pre K&R C) foo(a, b) { int c, d; c = a; d = b; return c+d; } // corresponding assembly code generated by cc .global _foo .text _foo: ~~foo: ~a=4 ~b=6 ~c=177770 ~d=177766 jsr r5, csv sub $4, sp mov 4(r5), -10(r5) mov 6(r5), -12(r5) mov -10(r5), r0 add -12(r5), r0 jbr L1 L1: jmp cret 做了什么。魔术数字来自~~foo:~c=177770。硬件是pdp-11/40。

1 个答案:

答案 0 :(得分:0)

tildes看起来像确定堆栈使用情况的数据。您可能会发现回忆一下pdp-11使用16位整数,并且DEC首选八进制数字超过十六进制

jsr r5, csv

是一种使寄存器5(r5)指向某些数据(可能是偏移列表)的方法。

数字对应于 octal 中堆栈的偏移量。假设调用者执行类似

的操作
  • 将a和b推入堆栈(正偏移)
  • 将返回地址压入堆栈(offset = 0)
  • 可能会推送csv函数
  • 中的其他内容
  • c和d是局部变量(负偏移,因此" 17777x")

那一行

~d=177776

看起来很奇怪 - 我期待

~d=177766

因为它应该低于堆栈上的c。寄存器操作数中的-10-12偏移看起来像是八进制数。您应该能够通过上下文将偏移量与变量进行匹配。

这只是一个有根据的猜测:我在text-editor中修改了jsr + r5成语。

具有波浪线的线是符号定义。有一个线索是在 DECUS C编译器参考,在

找到
ftp://ftp.update.uu.se/pub/pdp11/rsx/lang/decusc/2.19/005003/CC.DOC

  3.3  Global Symbols Containing Radix-50 '$' and '.' 
         ______ _______ __________ ________     ___

    With  this  version  of  Decus C, it is possible to generate and
    access global symbols which contain the Radix-50  '.'  and  '$'.
    The  compiler allows identifiers to contain the Ascii '$', which
    becomes a Radix-50 '$' in the object code.  The AS assembly code
    shows  this  character as a tilde (~).  The underscore character
    (_) in a C program  becomes  a  '.'  in  both  the  AS  assembly
    language  and  in  the  object  code.  This allows C programs to
    access all global symbols:  

            extern int $dsw;  
            .  .  .  
            printf("Directive status = %06o\n", $dsw);  

    The  above  prints  the current contents of the task's directive
    status word.

所以你可以阅读

~a=4

作为

$a=4

并且看到 $a 是(或多或少)传统符号。