📌  相关文章
📜  教资会网络 | UGC NET CS 2017 年 1 月至 2 日 |问题 3(1)

📅  最后修改于: 2023-12-03 15:26:04.226000             🧑  作者: Mango

UGC NET CS 2017 年 1 月至 2 日 | 问题 3

这道题目涉及到编程语言的特征和编译器的工作原理,是算法和数据结构学习的基础。程序员必须对此有一定的了解和掌握。

问题描述

在C语言中,通过以下程序段打印出'a'。

char a = 'a';
char *p = &a;
printf("%c", *p);

问:将以上程序段编译后,生成的汇编代码中,哪行代码是进行'a'的输出操作?

程序员需要知道
  1. C语言中,字符类型用char表示,其占用内存空间为1个字节,可以用单引号来初始化。例如'a'就是一个字符型的变量。
  2. 指针用来存储变量的内存地址,可以通过&操作符获取变量的地址并赋值给指针型变量。例如,字符a的地址可以用&p来表示。
  3. printf函数可以输出格式化的输出,其中%c表示输出字符型变量,%s表示输出字符串,%d表示输出整型,%f表示输出浮点型等等。
  4. 编译器将源代码编译成目标代码,生成汇编代码,然后再由汇编器将汇编代码转换成可执行文件。对于每一条源代码,都会生成对应的汇编代码。
程序员的解答

正解:第4行代码

解题思路:

  1. 第1行定义了一个字符型变量a,并初始化为字符'a'。
  2. 第2行定义了一个指针变量p,并把变量a的地址赋给了p。
  3. 第3行使用printf函数输出字符型变量*p的值。
  4. 在编译代码的过程中,编译器会将C代码转换成汇编代码。通过反汇编器(disassembler)查看汇编代码,可以得到以下汇编语句。
lea rax, [rbp-0x1]
movzx eax, byte ptr [rax]
movsx edx, al
mov edi, offset .L.str
mov eax, 0
call printf
  1. 上述汇编代码的第4行mov edi, offset .L.str是进行字符型变量a的输出操作的语句。其中,字符串常量".L.str"存储了输出格式字符串"%c"。数量(str)后的$L表示该字符串是汇编器生成的本地标签(local label)。
.L.str:
  .ascii "%c\0"