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



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

// 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~d=177766中的神奇数字从何而来.硬件为 pdp-11/40。

波浪号看起来像决定堆栈使用情况的数据。 您可能会发现回想一下 pdp-11 使用 16 位整数,并且 DEC 更喜欢八进制数字而不是十六进制,这很有帮助。

jsr r5, csv

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

这些数字对应于堆栈上的偏移量(以八进制表示)。 假定调用方执行类似操作

  • 将 A 和 B 推到堆栈上(正偏移)
  • 将返回地址推送到堆栈上(偏移量 = 0)
  • 可能会在csv函数中推送其他内容
  • c 和 d 是局部变量(负偏移量,因此称为"17777x")

那条线

~d=177776

看起来很奇怪 - 我期待

~d=177766

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

这只是一个有根据的猜测:我不久前在文本编辑器中改编了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 = %06on", $dsw);  
The  above  prints  the current contents of the task's directive
status word.

所以你可以阅读

~a=4

$a=4

并看到$a是一个(或多或少)常规符号。

相关内容

  • 没有找到相关文章

最新更新