Site Overlay

CSAPP 复习笔记:机器语言

参考

  1. https://zhuanlan.zhihu.com/p/104516688

例题

【例子】 gcc 生成汇编代码的命令是?

gcc -S xx.c

【知识点】 操作 float/double 时的指令后缀分别是?

s/l

【知识点】 常用的寄存器标识

OF-Overflow 是否溢出

SF-Sign 是否有符号

ZF-Zero 是否为零

CF-Carry 是否进位

【知识点】 解释以下后缀的含义

-b:
-s:
-l:
-q:
-t:

-b:b=byte,8bit
-s:s=short,16bit integer
-l:l=long,32bit integer
-q:q=quad,64bit
-t:t=ten btyes,80bit

【例子】 cltq 是什么指令?

convert long to quad word 扩展 eax 到四字。相当于 movslq %eax,%rax

【例子】 set 是什么指令?

根据条件码设置 D。比如 setl D 表示当结果为有符号小于时,设置 D = 1

【例子】 解释指令 sal n, DEST ;

把 DEST 的值左移 n bit

【例子】 解释下面条件后缀的含义:

-e/z
-ne/nz
-s
-ns
-g
-ge
-l
-le
-a
-ae
-b
-be

-e/z b = a Equal,相等
-ne/nz b != aNot Equal,不等
-s n < 0 Sign,有符号,即负数
-ns n >= 0 Not Sign,无符号
-g b > a Greater
-ge b >= a Greater or Equal
-l b < a Less
-le b <= a Less or Equal
-a b > a Above(无符号)
-ae b >= a Above or Equal(无符号)
-b b < a Below(无符号)
-be b <= a Below(无符号)

【知识点】 函数被调用的时候,各个参数分别在什么寄存器?

di,si,dx,cx,r8,r9 分别是 1\~6 个参数

【知识点】 被调用者保存寄存器保存在哪里?

内存中的栈

【知识点】 被调用者保存寄存器有哪些?

%rbx、%rbp%r12~%r15

除了上面的寄存器外,都属于被调用者保存寄存器

【知识点】 返回值在返回前被放到哪里?

%rax

【知识点】 callq 相当于哪两条指令?

相当于 pushq %rip;jmpq addr

【知识点】 retq 相当于什么指令?

相当于 popq %rip

【知识点】 test a, b 指令有什么用?

相当于求 a & b (与运算),根据运算结果设置标识寄存器。

【例子】 cmp %ebx, %eax 是根据谁减谁确定标识?

%eax - %ebx

【例子】 函数第七个参数的地址是什么?

第7个参数的地址为 8(%rsp),加 8 是为了给返回地址让出空间。(注意,栈顶做加法,实际上是向栈低移动。)

【例子】 一个函数运行完时,%rsp 指向的是?

返回地址

【例子】 2020 年的 64 位机普遍的内存上限是多少?理论上限是多少?

目前实际上限是 2^47bytes = 128TiB,理论上限是 2^64bytes.

【例子】 定义为 extern type xxx; 的符号,在哪一个段?

不知道,取决于定义的具体位置。

【例子】 定义为 static type xxx; 的符号,在哪一个段?

bss(未初始+全局)

【例子】 定义为 type xxx = xxx; 的符号,在哪一个段?

data(已初始+全局)(当然,有例外:如果被显示地初始化为0,依旧被看做未初始化,保存在 bss 段)

【例子】 定义为 type function(){} 的符号,在哪一个段?

text (写死)

发表评论

电子邮件地址不会被公开。 必填项已用*标注