例如,下面是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。
答案 0 :(得分:0)
tildes看起来像确定堆栈使用情况的数据。您可能会发现回忆一下pdp-11使用16位整数,并且DEC首选八进制数字超过十六进制。
这
jsr r5, csv
是一种使寄存器5(r5)指向某些数据(可能是偏移列表)的方法。
数字对应于 octal 中堆栈的偏移量。假设调用者执行类似
的操作csv
函数那一行
~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
是(或多或少)传统符号。