教材学习内容总结
1.disas 反汇编当前函数。
2.print /x $rax 以十六进制输出%rax的内容
3.info registers查看所有寄存器的值
4info frame查看有关当前栈帧的信息,并非所有栈帧的信息。
5.使用 up down ,跳转不同堆栈,查询其中的堆栈简要信息。
6.构建栈帧的语句enter等价于pushq %rbp , movq %rsp, %rbp。
7.销毁栈帧的语句leave等价于:movq %rbp, %rsp,popq %rbp。
8.函数调用过程中,栈用来:
传递参数:用栈来管理他的过程所需要的存储空间,栈和程序寄存器存放着传递控制和数据、分配内存所需要的信息”即传递参数。
存储返回信息:当前正在执行的过程的帧总是在栈顶。当过程P调用过程Q时,会把返回地址压入栈中”即存储返回信息
保存寄存器:Q的代码会扩展当前栈的边界,分配她的栈帧所需的空间。在这个空间中,他可以保存寄存器的值,分配局部变量空间”即保存寄存器.
局部存储:为了提高空间和时间效率,x86-64过程只分配自己所需要的栈帧部分”即局部存储。
9.可以使用汇编的有条件和无条件跳转来实现C语言的条件分支。
10.可以使用数据的条件转移来实现C语言的条件分支。
11.可以使用条件测试和跳转组合起来实现循环。
12.跳转指令与ZF有关的是je、ja、jbe。
13.leaq指令不影响条件码寄存器。
14.ZF:零标志。
CF:进位标志。
SF:符号标志。
OF:溢出标志。最近的操作导致一个补码溢出——正溢出或负溢出。
CMP指令根据两个操作数之差来设置条件码。除了只设置条件码而不更新目的寄存器之外,与SUB指令的行为是一样的。
15.SAL和SHL效果一样,移位量可以是一个立即数,移位量可以放在%cl中。
16.函数调用的返回值存在%rax寄存器中。
17.push不影响%rbp的值。
18.其中最特别的是栈指针%rsp,用来指明运行时栈的结束位置。
19.movl(传送双字)”即传送4字节。
20.push %rbx对应的机器码是0x53
21.X86-64中虚拟地址的数量目前是248个,在目前的实现中,这些地址的高16位必须设置为0,所以一个地址实际上能够指定的是248或64TB范围内的一个字节。
22.要实现c中的if,while所需的条件变化,需要条件码寄存器中的信息。条件码寄存器保存着最近执行的算数或逻辑指令的状态信息。他们用来实现控制或数据流中的条件变化,比如说用来实现if和while语句。
23.程序计数器(通常成为“PC”,在x86-64中用%rip表示)给出将要执行的下一条指令在内存中的地址。
24.在Linux系统中,带‘-d’命令行标志的程序OBJDUMP(表示“object dump”)可以充当这个角色:linux> objdump -d mstore.o。
25.对于机器级编程来说,其中两种抽象尤为重要。第一种是有指令集体系结构或指令集结构(ISA)来定义的机器级程序的格式和行为第二种抽象是机器级程序使用的内存地址是虚拟地址。
26.Intel的处理模型中Pentium 4E首次引入超线程技术。
27.Intel的处理模型中i386首次将体系结构扩展到32位,增加了平坦寻址模式。
教材学习中的问题和解决过程
9.对于下面的值,有关算术运算的指令正确的是(ABC)
A .
addq %rcx,(%rax), 目的地址是0x100
B .
addq %rcx,(%rax), 目的地址的内容是0x100
C .
subq %rdx, 8(%rax) 的值是0xA8
D .
incq 16(%rax)值是12
16.对于图中内存地址和寄存器的值,下面说法正确的是(ADEF)
A .
%rax的值是0x100
B .
(%rax)的值是0x100
C .
(%rax)的值是0x104
D .
(%rax)的值是0xFF
E .
4(%rax)的值是0xAB
F .
(%rax,%rcx,4)的值是0xAB
G .
(%rax,%rcx,4)的值是0x104