文章列表

27k25 分钟

本章中我们需要实现 3 个目标: 设计一个顺序结构的 Y86_64 架构处理器 设计一个流水线结构的 Y86_64 架构处理器 设计一个包含冒险控制的 Y86_64 架构处理器 # Y86_64 指令集架构 Y86_64 指令集架构的基本格式如下: 1 字节的指令指示符,包含 4 位的代码段和 4 位的功能段 1 字节的寄存器指示符(部分指令没有) 8 个字节的常数(部分指令没有) 此外,Y86_64 指令集架构包含 16 个寄存器,编号为:0-F,其中 F 表示这条指令无需寄存器,此外 %rsp 寄存器的值为 4。并且 Y86_64 处理器的异常处理机制就是让处理器停止执行指令。
7.1k6 分钟

输入 gdb activity ,开启 activity 之旅。 Objective: The goal of this activity is to input a string that causes the program to call win(0x15213), and thereby win a cookie. 在开启之前,先查看一下 solve 函数的内容: void solve(void) { volatile long before = 0xb4; char buf[16]; volatile long after &#x
8.9k8 分钟

# act1 依次输入如下指令: (gdb) disassemble main // show the assembly instructions in main 其 main 函数反汇编结果如下: (gdb) disassemble main Dump of assembler code for function main: 0x0000000000401730 <+0>: endbr64 0x0000000000401734 <+4>: push %rbx 0x0000000000401735 <+
16k15 分钟

# Activity 1 输入 gdb --args ./calls ,输入 r ,提示如下: (gdb) r If you didn't run it that way, it will now crash. Otherwise, you will get the (gdb) prompt back. Type 'c' (short for 'continue') at the (gdb) prompt. Program received signal SIGTRAP, Trace/breakpoint trap. main
9.7k9 分钟

输入 gdb ./data-layout ,开启 Data activity 之旅。 # Integers and Local Variables returnOne 的 C 语言版本如下: int returnOne (void) &#123; int local = -1; return abs(local);&#125;输入 disassemble returnOne ,得到如下结果: (gdb) disassemble returnOne Dump of assembler code for function returnOne:
16k15 分钟

# Basic Control Flow 首先回答 Q1:为什么 JZ 和 JE 指令相同? 对于 JZ,即 jump if zero,在跳转之前,我们首先需要将其与 0 做差,判断结果的 ZF 是否等于 1。对于 JE,我们首先将两数做差(也可以使用 testq 指令?),然后判断 ZF 是否等于 1。JZ 和 JE 都是对 ZF 进行判断,然后进行跳转。 然后我们回答 Q2:首先阅读 jumps.S 。我们发现 jumps.S 就是以 jump_insns 开头的一群跳转指令的集合。然后我们输入如下指令: $ as jumps.S -o jumps.o$ objdump -d jum
2.9k3 分钟

# Part I 输入如下命令: $ gcc -o phase1 -g -std=c99 phase1.c $ gdb ./phase1 按照 handout 依次输入命令并观察结果。 # 打断点 (gdb) break main Breakpoint 1 at 0x13b2: file phase1.c, line 54. (gdb) break unscramble Breakpoint 2 at 0x1308: file phase1.c, line 39. (gdb) break reverse Breakpoint 3 at 0x1274: file phase
14k13 分钟

# Activity 1 运行 gdb ./act1(gdb) r 1出现如下提示: If you have questions about the commands, type (gdb) help <command> Now type (gdb) info registers This will display all of the integer registers. Registers are basically the only local "variables" in assembly. They are not located in me
2k2 分钟

# 信息的表示和处理 信息 = 二进制位的组合 + 对位组合的解释:无符号,补码,有符号整数,浮点数。 介绍了一点 C 语言的演变历史:汇编不方便 —> ANSI C -> ISC C90 -> ISO C99 -> ISO C11 (可以在编译时通过 -std=cxx 指定编译所使用的版本) 1 个字节 = 8 位 -> 内存中信息的编码以字节为单位 -> 机器级程序将内存看作一个大的数组(虚拟内存)-> 利用指针来存储地址 -> 指针是机器级代码的概念,其组成包含类型 + 值,但是类型在内存当中是不可见的,