PowerPoint 演示文稿

Size: px
Start display at page:

Download "PowerPoint 演示文稿"

Transcription

1 计算机系统基础 Programming Assignment PA 2 程序的执行 ( 第一课 ) PA 2-1 指令解码与执行 2017 年 9 月 22 日

2 前情提要 Monitor 调试命令 CPU 寄存器堆 GPRs EFLAGS ALU FPU 主存 NEMU PA 1 Pass ======== reg test ======== reg_test() pass ======== fpu test ======== fpu_test_add() pass fpu_test_sub() pass fpu_test_mul() pass fpu_test_div() pass ======== alu test ======== alu_test_add() pass alu_test_adc() pass alu_test_sub() pass alu_test_sbb() pass alu_test_and() pass alu_test_or() pass alu_test_xor() pass alu_test_shl() pass alu_test_shr() pass alu_test_sal() pass alu_test_sar() pass alu_test_mul() pass alu_test_div() pass alu_test_imul() pass alu_test_idiv() pass 迟交将受到该阶段 10% 分数的惩罚 数据的存储 寄存器 主存 ( 内存 ) 内存 vaddr_read/write() 接口教程上少写了 sreg 参数, 现在可以不理会该参数,PA 3 才会涉及 数据的表示和运算 整数 : 带符号 无符号 -> 各种运算 -> 标志位寄存器 带小数的实数 :IEEE 754 浮点数 -> 各种运算和规格化 群公告中发布了几则针对框架代码的补丁 2017 年 9 月 22 日星期五 Programming Assignment 2

3 前情提要 计算机 餐厅 解决计算问题的步骤 程序 菜谱 做菜的步骤 程序处理的对象 数据 食材 做菜加工的对象 执行程序的器件 CPU 大厨 执行菜谱的人 储存正在处理的数据 CPU 内部的寄存器 灶台上的锅 放置正在加工的食材 储存马上要用的数据 主存 厨房里的冰箱 储存马上用的菜谱和食材 存储大量的数据 硬盘 仓库 啥都放这里 2017 年 9 月 22 日星期五 Programming Assignment 3

4 前情提要 计算机 餐厅 解决计算问题的步骤 程序 菜谱 做菜的步骤 程序处理的对象 数据 食材 做菜加工的对象 执行程序的器件 CPU 大厨 执行菜谱的人 储存正在处理的数据 CPU 内部的寄存器 灶台上的锅 放置正在加工的食材 储存马上要用的数据 主存 厨房里的冰箱 储存马上用的菜谱和食材 存储大量的数据 硬盘 仓库 啥都放这里 2017 年 9 月 22 日星期五 Programming Assignment 4

5 PA 2-1 指令解码与执行 指令的编码方式 指令序列的执行流程 NEMU 模拟指令译码和执行 ( 用于精简指令实现的宏 ) NEMU 运行测试用例 备用内容 : 可选任务 PA 表达式求值 2017 年 9 月 22 日星期五 Programming Assignment 5

6 指令的编码方式 & 指令序列的执行流程 2017 年 9 月 22 日星期五 Programming Assignment 6

7 指令的编码方式 菜谱中的步骤以自然语言写成 将油倒入锅中加热油至七成热 动作序列 1. 倒入油, 锅 2. 加热油 3. 比较油温, 七成热 4. jl 3 机器是看不懂文字的 只懂 0 和 1 机器也无法理解自然语言 必须规定格式 编码 动作操作码 对象 1, 对象 2, 对象 3, 操作数 1, 操作数 2, 操作数 3, 2017 年 9 月 22 日星期五 Programming Assignment 7

8 指令的编码方式 操作码 (ModR/M 中也可能包含一点 ) 各种前缀, 我们只模拟 operandsize prefix, 其值为 0x66 各种找到操作数 ( 寻址 ) 的办法 instruction address- operand- segment opcode ModR/M SIB displacement immediate prefix size prefix size prefix override OR 1 0 OR 1 0 OR 1 0 OR 1 1 OR 2 0 OR 1 0 OR 1 0,1,2 OR 4 0,1,2 OR number of bytes 最大是 4, 体现我们是 32 位机 2017 年 9 月 22 日星期五 Programming Assignment 8

9 指令的编码方式 理解指令译码的过程 ( 假设此时 EIP 取初始值, 为某程序第一条指令 ) EIP 8b b 45 f4 1. 不是 0x66, 操作数 32 位,0x8b 为操作码 2. 查 i386 手册 2017 年 9 月 22 日星期五 Programming Assignment 9

10 指令的编码方式 理解指令译码的过程 ( 假设此时 EIP 取初始值, 为某程序第一条指令 ) opcode 8b b 45 f4 1. 不是 0x66, 操作数 32 位,0x8b 为操作码 2. 查 i386 手册 Appendix A 0x8b 对应 MOV Gv, Ev Intel 格式, 表示把一个 Ev 类型操作数 MOV 到 Gv 类型操作数里 objdump 和 gdb 中采用的 AT&T 格式指令操作数顺序正好相反 若有需要, 到 i386 手册 Chapter 17 细查 3. Ev 和 Gv 都说明后面跟 ModR/M 字节 2017 年 9 月 22 日星期五 Programming Assignment 10

11 指令的编码方式 理解指令译码的过程 ( 假设此时 EIP 取初始值, 为某程序第一条指令 ) opcode modr/m 8b b 45 f4 1. 不是 0x66, 操作数 32 位,0x8b 为操作码 2. 查 i386 手册 Appendix A 0x8b 对应 MOV Gv, Ev 3. Ev 和 Gv 都说明后面跟 ModR/M 字节 0x94 = MOD REG/OPCODE R/M 2017 年 9 月 22 日星期五 Programming Assignment 11

12 指令的编码方式 理解指令译码的过程 ( 假设此时 EIP 取初始值, 为某程序第一条指令 ) opcode modr/m 8b b 45 f4 1. 不是 0x66, 操作数 32 位,0x8b 为操作码 2. 查 i386 手册 Appendix A 0x8b 对应 MOV Gv, Ev 3. Ev 和 Gv 都说明后面跟 ModR/M 字节 根据 Gv 和没有 0x66 前缀,010 表示 edx 0x94 = MOD REG/OPCODE R/M 2017 年 9 月 22 日星期五 Programming Assignment 12

13 指令的编码方式 理解指令译码的过程 ( 假设此时 EIP 取初始值, 为某程序第一条指令 ) opcode modr/m 8b b 45 f4 1. 不是 0x66, 操作数 32 位,0x8b 为操作码 2. 查 i386 手册 Appendix A 0x8b 对应 MOV Gv, Ev 3. Ev 和 Gv 都说明后面跟 ModR/M 字节 查 i386 手册表 17-3, 发现是内存地址 disp32[--][--], 还有 SIB 字节 0x94 = MOD REG/OPCODE R/M 2017 年 9 月 22 日星期五 Programming Assignment 13

14 指令的编码方式 理解指令译码的过程 ( 假设此时 EIP 取初始值, 为某程序第一条指令 ) opcode modr/m 8b b 45 f4 sib 4. 根据 Mod + R/M 域决定有 SIB 字节 ( 内存地址 disp32[--][--]) 1. 不是 0x66, 操作数 32 位,0x8b 为操作码 2. 查 i386 手册 Appendix A 0x8b 对应 MOV Gv, Ev 3. Ev 和 Gv 都说明后面跟 ModR/M 字节 0x83 = SS INDEX BASE 2017 年 9 月 22 日星期五 Programming Assignment 14

15 指令的编码方式 理解指令译码的过程 ( 假设此时 EIP 取初始值, 为某程序第一条指令 ) opcode modr/m 8b b 45 f4 sib 1. 不是 0x66, 操作数 32 位,0x8b 为操作码 2. 查 i386 手册 Appendix A 0x8b 对应 MOV Gv, Ev 3. Ev 和 Gv 都说明后面跟 ModR/M 字节 4. 根据 Mod + R/M 域决定有 SIB 字节 ( 内存地址 disp32[--][--]) 查 i386 手册表 17-4 内存地址 = disp32+ebx+eax*4 0x83 = SS INDEX BASE *4 eax ebx 2017 年 9 月 22 日星期五 Programming Assignment 15

16 指令的编码方式 理解指令译码的过程 ( 假设此时 EIP 取初始值, 为某程序第一条指令 ) opcode modr/m disp32 8b b 45 f4 sib 5. SIB 字节后面自然还有 disp32 32 位的偏移量 ( 小端方式 ) 1. 不是 0x66, 操作数 32 位,0x8b 为操作码 2. 查 i386 手册 Appendix A 0x8b 对应 MOV Gv, Ev 3. Ev 和 Gv 都说明后面跟 ModR/M 字节 4. 根据 Mod + R/M 域决定有 SIB 字节 ( 内存地址 disp32[--][--]) 2017 年 9 月 22 日星期五 Programming Assignment 16

17 指令的编码方式 理解指令译码的过程 ( 假设此时 EIP 取初始值, 为某程序第一条指令 ) opcode modr/m disp32 后续指令 8b b 45 f4 sib EIP 指向下一条指令 1. 不是 0x66, 操作数 32 位,0x8b 为操作码 2. 查 i386 手册 Appendix A 0x8b 对应 MOV Gv, Ev 3. Ev 和 Gv 都说明后面跟 ModR/M 字节 4. 根据 Mod + R/M 域决定有 SIB 字节 ( 内存地址 disp32[--][--]) 5. SIB 字节后面自然还有 disp32 32 位的偏移量 ( 小端方式 ) 6. 该指令所有需要的信息已经获得, 对应 AT&T 格式汇编 : movl 0x1100(%ebx, %eax, 4), %edx 2017 年 9 月 22 日星期五 Programming Assignment 17

18 指令的编码方式 X86 有多少条指令? I386 手册 Chapter 17 手册上没有的 : 指令怎么那么多? 结构怎么这么复杂? 复杂指令集计算机 (CISC):Intel,AMD 为代表 程序员选择多 优化方案多 可扩展性强, 向下兼容性好 有没有简单点的? 精简指令集计算机 (RISC):MIPS 为代表 CPU 实现简单, 嵌入式系统欢迎 一条指令集计算机 (One Instruction Set Computers, OISC) 它们的计算能力是等价的 ( 学完数理逻辑 图灵机会明白 ) 2017 年 9 月 22 日星期五 Programming Assignment 18

19 指令序列的执行流程 内存 :8b b 45 f4 根据 EIP 取指令 ( 操作码 ) 取源操作数 更新 EIP CPU 写目的操作数 执行数据操作 mov, add, sub, 先把指令依次在内存中排好, 给 EIP 赋一个初始值, 指向第一条指令, CPU 就可以循环执行每一条指令了 2017 年 9 月 22 日星期五 Programming Assignment 19

20 NEMU 模拟指令译码和执行 2017 年 9 月 22 日星期五 Programming Assignment 20

21 NEMU 模拟指令译码和执行 指令循环 : 一条接一条的执行指令 怎么从 main 走到这个函数的? 我们最后讲 3. 根据指令长度更新 EIP, 指向下一条指令 void exec(uint32_t n) { while( n > 0 && nemu_state == NEMU_RUN) { instr_len = exec_inst(); 循环执行指令 cpu.eip += instr_len; n--; int exec_inst() { uint8_t opcode = 0; 执行一条指令 nemu/src/cpu/cpu.c // get the opcode, 取操作数 opcode = instr_fetch(cpu.eip, 1); 1. 取指令 // instruction decode and execution, 执行这条指令 int len = opcode_entry[opcode](cpu.eip, opcode); return len; // 返回指令长度 假设此时指令已经在内存中排好了, EIP 初始化为第一条指令的地址, 谁干的? 我们最后讲 uint32_t instr_fetch(vaddr_t vaddr, size_t len) { assert(len == 1 len == 2 len == 4); return vaddr_read(vaddr, SREG_CS, len); 2. 模拟执行 2017 年 9 月 22 日星期五 Programming Assignment 21

22 NEMU 模拟指令译码和执行 opcode_entry 是一个函数指针数组 其中每一个元素指向一条指令的模拟函数 访问 opcode_entry[opcode] == 调用对应位置指向的函数 nemu/src/cpu/decode/opcode.c #include "cpu/instr.h" instr_func opcode_entry[256] = { nemu/include/cpu/instr_helper.h 实现某一条指令的功能 // the type of an instruction entry typedef int (*instr_func)(uint32_t eip, uint8_t opcode); 2017 年 9 月 22 日星期五 Programming Assignment 22

23 内存 : C mov_i2rm_v 是模拟 C7 指令的函数 make_instr_func(mov_i2rm_v) { OPERAND rm, imm; rm.data_size = data_size; int len = 1; len += modrm_rm(eip + 1, &rm); imm.type = OPR_IMM; imm.addr = eip + len; imm.data_size = data_size; 当前 EIP nemu/src/cpu/instr/mov.c nemu/src/cpu/cpu.c void exec(uint32_t n) { while( n > 0 && nemu_state == NEMU_RUN) { instr_len = exec_inst(); 5. 循环开启下一条指令 cpu.eip += instr_len; n--; 1. cpu.eip 指向 C7 int exec_inst() { uint8_t opcode = 0; opcode = instr_fetch(cpu.eip, 1); int len = opcode_entry[opcode](cpu.eip, opcode); return len; // 返回指令长度 2. Opcode 取出为 C7 operand_read(&imm); rm.val = imm.val; operand_write(&rm); return len + data_size / 8; #include "cpu/instr.h" instr_func opcode_entry[256] = { /* 0xc4-0xc7*/ inv, inv, mov_i2rm_b, mov_i2rm_v, 4. 返回指令长度 nemu/src/cpu/decode/opcode.c 3. 访问数组即函数调用

24 NEMU 模拟指令译码和执行 所以 PA 2-1 要做的任务 : 执行 make run 或 make test invalid opcode(eip = 0x ): 83 f c There are two cases which will trigger this unexpected exception: 1. The instruction at eip = 0x is not implemented. 2. Something is implemented incorrectly. Find this eip value(0x ) in the disassembling result to distinguish which case it is. If it is the first case, see _ (_) \ / _ \ / / \/ ) (_) / /_ \ / < > _ < '_ \ \/ / _` '_ \ / _` ) (_) (_) (_ _ (_ _ / \ / \ / _ _ \,_ _ _ \,_ \,_ _ for more details. If it is the second case, remember: * The machine is always right! * Every line of untested code is always wrong! 1. 写该操作码对应的 instr_func 2. 把这个函数在 nemu/include/cpu/instr.h 中声明一下 3. 在 opcode_entry 对应该操作码的地方把这个函数的函数名填进去替代原来的 inv 4. 重复上述过程直至完成所有需要模拟的指令 2017 年 9 月 22 日星期五 Programming Assignment 24

25 NEMU 模拟指令译码和执行 怎么写某操作码对应的 instr_func? // 宏展开后这一行即为 int mov_i2rm_v(uint32_t eip, uint8_t opcode) { make_instr_func(mov_i2rm_v) { OPERAND rm, imm; // OPERAND 定义在 nemu/include/cpu/operand.h // 看教程 rm.data_size = data_size; // data_size 是个全局变量, 表示操作数的比特长度 int len 这是一条把一个立即数 = 1; // opcode 长度 mov 1 字节到 R/M 中的指令, 操作数 len += modrm_rm(eip + 1, &rm); // 读 ModR/M 字节,rm 的 type 和 addr 会被填写 长度为 16 或 32 位 imm.type = OPR_IMM; // 填入立即数类型 imm.addr 推荐命名规则 = eip + len; :// 找到立即数的地址 imm.data_size = data_size; 指令名 _ 源操作数类型 2 目的操作数类型 _ 长度后缀 operand_read(&imm); rm.val = imm.val; operand_write(&rm); // 执行 mov 操作 return len + data_size / 8; // opcode 长度 + ModR/M 字节扫描长度 + 立即数长度 2017 年 9 月 22 日星期五 Programming Assignment 25

26 NEMU 模拟指令译码和执行 怎么写某操作码对应的 instr_func? // 宏展开后这一行即为 int mov_i2rm_v(uint32_t eip, uint8_t opcode) { make_instr_func(mov_i2rm_v) { OPERAND rm, imm; // OPERAND 定义在 nemu/include/cpu/operand.h // 看教程 rm.data_size = data_size; // data_size 是个全局变量, 表示操作数的比特长度 int len = 1; // opcode 长度 1 字节 len += modrm_rm(eip + 1, &rm); // 读 ModR/M 字节,rm 的 type 和 addr 会被填写 imm.type = OPR_IMM; // 填入立即数类型 imm.addr = eip + len; // 找到立即数的地址 imm.data_size = data_size; operand_read(&imm); rm.val = imm.val; operand_write(&rm); // 执行 mov 操作 return len + data_size / 8; // opcode 长度 + ModR/M 字节扫描长度 + 立即数长度 2017 年 9 月 22 日星期五 Programming Assignment 26

27 NEMU 模拟指令译码和执行 怎么写某操作码对应的 instr_func? // 宏展开后这一行即为 int mov_i2rm_v(uint32_t eip, uint8_t opcode) { make_instr_func(mov_i2rm_v) { OPERAND rm, imm; // OPERAND 定义在 nemu/include/cpu/operand.h // 看教程 rm.data_size = data_size; // data_size 是个全局变量, 表示操作数的比特长度 nemu/include/cpu/instr_helper.h int len = 1; // opcode 长度 1 字节 len += modrm_rm(eip + 1, &rm); // 读 ModR/M 字节,rm 的 type 和 addr 会被填写 #define make_instr_func(name) int name(uint32_t eip, uint8_t opcode) imm.type = OPR_IMM; // 填入立即数类型 imm.addr = eip + len; // 找到立即数的地址 imm.data_size = data_size; operand_read(&imm); rm.val = imm.val; operand_write(&rm); // 执行 mov 操作 return len + data_size / 8; // opcode 长度 + ModR/M 字节扫描长度 + 立即数长度 2017 年 9 月 22 日星期五 Programming Assignment 27

28 NEMU 模拟指令译码和执行 怎么写某操作码对应的 instr_func? // 宏展开后这一行即为 int mov_i2rm_v(uint32_t eip, uint8_t opcode) { make_instr_func(mov_i2rm_v) { OPERAND rm, imm; // OPERAND 定义在 nemu/include/cpu/operand.h // 看教程 rm.data_size = data_size; // data_size 是个全局变量, 表示操作数的比特长度 int len = 1; // opcode 长度 1 字节 len += modrm_rm(eip + 1, &rm); // 读 ModR/M 字节,rm 的 type 和 addr 会被填写 imm.type = OPR_IMM; // 填入立即数类型 imm.addr = eip + len; // 找到立即数的地址 imm.data_size = data_size; operand_read(&imm); rm.val = imm.val; operand_write(&rm); // 执行 mov 操作 return len + data_size / 8; // opcode 长度 + ModR/M 字节扫描长度 + 立即数长度 2017 年 9 月 22 日星期五 Programming Assignment 28

29 NEMU 模拟指令译码和执行 怎么写某操作码对应的 instr_func? nemu/include/cpu/operand.h // 宏展开后这一行即为 int mov_i2rm_v(uint32_t eip, uint8_t opcode) { make_instr_func(mov_i2rm_v) { OPERAND rm, imm; // OPERAND 定义在 nemu/include/cpu/operand.h enum {OPR_IMM, OPR_REG, OPR_MEM, // 看教程 OPR_CREG, OPR_SREG; rm.data_size = data_size; // data_size 是个全局变量, 表示操作数的比特长度 int len = 1; // opcode 长度 1 字节 typedef struct { len += modrm_rm(eip + 1, &rm); // 读 ModR/M 字节,rm 的 type 和 addr 会被填写 int type; // addr 地址, 随 type 不同解释也不同 imm.type = OPR_IMM; // 填入立即数类型 uint32_t addr; imm.addr = eip + len; // 找到立即数的地址 uint8_t sreg; // 现在不管 imm.data_size = data_size; uint32_t val; // data_size = 8, 16, 32 operand_read(&imm); // 执行 mov 操作 size_t data_size; rm.val = imm.val; #ifdef DEBUG operand_write(&rm); MEM_ADDR mem_addr; #endif return len + data_size / 8; // opcode 长度 + ModR/M 字节扫描长度 + 立即数长度 OPERAND; 2017 年 9 月 22 日星期五 Programming Assignment 29

30 NEMU 模拟指令译码和执行 怎么写某操作码对应的 instr_func? // 宏展开后这一行即为 int mov_i2rm_v(uint32_t eip, uint8_t opcode) { make_instr_func(mov_i2rm_v) { OPERAND rm, imm; // OPERAND 定义在 nemu/include/cpu/operand.h // 看教程 rm.data_size = data_size; // data_size 是个全局变量, 表示操作数的比特长度 int len = 1; // opcode 长度 1 字节 len += modrm_rm(eip + 1, &rm); // 读 ModR/M 字节,rm 的 type 和 addr 会被填写 imm.type = OPR_IMM; // 填入立即数类型 imm.addr = eip + len; // 找到立即数的地址 imm.data_size = data_size; operand_read(&imm); rm.val = imm.val; operand_write(&rm); // 执行 mov 操作 return len + data_size / 8; // opcode 长度 + ModR/M 字节扫描长度 + 立即数长度 2017 年 9 月 22 日星期五 Programming Assignment 30

31 NEMU 模拟指令译码和执行 怎么写某操作码对应的 instr_func? // 宏展开后这一行即为 int mov_i2rm_v(uint32_t eip, uint8_t opcode) { make_instr_func(mov_i2rm_v) { OPERAND rm, imm; // OPERAND 定义在 nemu/include/cpu/operand.h // nemu/src/cpu/instr/data_size.c 看教程 rm.data_size = data_size; // data_size 是个全局变量, 表示操作数的比特长度 int len = 1; // uint8_t opcode data_size 长度 1 字节 = 32; len += modrm_rm(eip + 1, &rm); // 读 ModR/M 字节,rm 的 type 和 addr 会被填写 make_instr_func(data_size_16) { imm.type = OPR_IMM; // 填入立即数类型 uint8_t op_code = 0; imm.addr = eip + len; // 找到立即数的地址 int len = 0; imm.data_size = data_size; data_size = 16; op_code = instr_fetch(eip + 1, 1); operand_read(&imm); // 执行 mov len 操作 = opcode_entry[op_code](eip + 1, op_code); rm.val = imm.val; data_size = 32; operand_write(&rm); return 1 + len; return len + data_size / 8; // opcode 长度 + ModR/M 字节扫描长度 + 立即数长度 2017 年 9 月 22 日星期五 Programming Assignment 31

32 NEMU 模拟指令译码和执行 怎么写某操作码对应的 instr_func? // 宏展开后这一行即为 int mov_i2rm_v(uint32_t eip, uint8_t opcode) { make_instr_func(mov_i2rm_v) { OPERAND rm, imm; // OPERAND 定义在 nemu/include/cpu/operand.h // 看教程 rm.data_size = data_size; // data_size 是个全局变量, 表示操作数的比特长度 int len = 1; // opcode 长度 1 字节 len += modrm_rm(eip + 1, &rm); // 读 ModR/M 字节,rm 的 type 和 addr 会被填写 imm.type = OPR_IMM; // 填入立即数类型 imm.addr = eip + len; // 找到立即数的地址 imm.data_size = data_size; operand_read(&imm); rm.val = imm.val; operand_write(&rm); // 执行 mov 操作 return len + data_size / 8; // opcode 长度 + ModR/M 字节扫描长度 + 立即数长度 2017 年 9 月 22 日星期五 Programming Assignment 32

33 NEMU 模拟指令译码和执行 怎么写某操作码对应的 instr_func? // 宏展开后这一行即为 int mov_i2rm_v(uint32_t eip, uint8_t opcode) { make_instr_func(mov_i2rm_v) { OPERAND rm, imm; // OPERAND 定义在 nemu/include/cpu/operand.h // 看教程 rm.data_size = data_size; // data_size 是个全局变量, 表示操作数的比特长度 int len = 1; // opcode 长度 1 字节 len += modrm_rm(eip + 1, &rm); // 读 ModR/M 字节,rm 的 type 和 addr 会被填写 nemu/src/cpu/decode/modrm.c imm.type = OPR_IMM; // 填入立即数类型 imm.addr = eip + len; // 找到立即数的地址 imm.data_size = data_size; int modrm_rm(uint32_t eip, OPERAND * rm) ; operand_read(&imm); rm.val = imm.val; operand_write(&rm); // 执行就是查表过程变成代码 mov 操作会将传入的 rm 的 type 和 addr( 包括 sreg) 填好 return len + data_size / 8; // opcode 长度 + ModR/M 字节扫描长度 + 立即数长度 2017 年 9 月 22 日星期五 Programming Assignment 33

34 NEMU 模拟指令译码和执行 怎么写某操作码对应的 instr_func? // 宏展开后这一行即为 int mov_i2rm_v(uint32_t eip, uint8_t opcode) { make_instr_func(mov_i2rm_v) { OPERAND rm, imm; // OPERAND 定义在 nemu/include/cpu/operand.h // 看教程 rm.data_size = data_size; // data_size 是个全局变量, 表示操作数的比特长度 int len = 1; // opcode 长度 1 字节 len += modrm_rm(eip + 1, &rm); // 读 ModR/M 字节,rm 的 type 和 addr 会被填写 imm.type = OPR_IMM; // 填入立即数类型 imm.addr = eip + len; // 找到立即数的地址 imm.data_size = data_size; operand_read(&imm); rm.val = imm.val; operand_write(&rm); // 执行 mov 操作 return len + data_size / 8; // opcode 长度 + ModR/M 字节扫描长度 + 立即数长度 2017 年 9 月 22 日星期五 Programming Assignment 34

35 NEMU 模拟指令译码和执行 怎么写某操作码对应的 instr_func? // 宏展开后这一行即为 switch(opr->type) int mov_i2rm_v(uint32_t { eip, uint8_t opcode) { case OPR_MEM: make_instr_func(mov_i2rm_v) { case OPR_IMM: OPERAND rm, imm; // OPERAND opr->val 定义在 = vaddr_read(opr->addr, nemu/include/cpu/operand.h SREG_CS, 4); // 看教程 break; rm.data_size = data_size; case // data_size OPR_REG: 是个全局变量, 表示操作数的比特长度 if(opr->data_size == 8) { int len = 1; // opcode 长度 1 字节 len += modrm_rm(eip + 1, &rm); // 读 ModR/M 字节,rm 的 type 和 addr 会被填写 nemu/src/cpu/decode/operand.c void operand_read(operand * opr) { imm.type = OPR_IMM; // 填入立即数类型 break; imm.addr = eip + len; case // OPR_CREG: 找到立即数的地址 imm.data_size = data_size; case OPR_SREG: operand_read(&imm); rm.val = imm.val; operand_write(&rm); return len + data_size / 8; // deal with data size switch(opr->data_size) { else { // 执行 mov 操作 opr->val = cpu.gpr[opr->addr % 4]._8[opr->addr / 4]; opr->val = cpu.gpr[opr->addr]._32; case 8: opr->val = opr->val & 0xff; break; case 16: opr->val = opr->val & 0xffff; break; case 32: break; default: // opcode 长度 + ModR/M 字节扫描长度 + 立即数长度 2017 年 9 月 22 日星期五 Programming Assignment 35

36 NEMU 模拟指令译码和执行 怎么写某操作码对应的 instr_func? // 宏展开后这一行即为 int mov_i2rm_v(uint32_t eip, uint8_t opcode) { make_instr_func(mov_i2rm_v) { OPERAND rm, imm; // OPERAND 定义在 nemu/include/cpu/operand.h // 看教程 rm.data_size = data_size; // data_size 是个全局变量, 表示操作数的比特长度 int len = 1; // opcode 长度 1 字节 len += modrm_rm(eip + 1, &rm); // 读 ModR/M 字节,rm 的 type 和 addr 会被填写 imm.type = OPR_IMM; // 填入立即数类型 imm.addr = eip + len; // 找到立即数的地址 imm.data_size = data_size; operand_read(&imm); rm.val = imm.val; operand_write(&rm); // 执行 mov 操作 执行 mov 操作并且写目的操作数 return len + data_size / 8; // opcode 长度 + ModR/M 字节扫描长度 + 立即数长度 2017 年 9 月 22 日星期五 Programming Assignment 36

37 NEMU 模拟指令译码和执行 怎么写某操作码对应的 instr_func? // 宏展开后这一行即为 int mov_i2rm_v(uint32_t eip, uint8_t opcode) { make_instr_func(mov_i2rm_v) { OPERAND rm, imm; // OPERAND 定义在 nemu/include/cpu/operand.h // 看教程 rm.data_size = data_size; // data_size 是个全局变量, 表示操作数的比特长度 int len = 1; // opcode 长度 1 字节 len += modrm_rm(eip + 1, &rm); // 读 ModR/M 字节,rm 的 type 和 addr 会被填写 imm.type = OPR_IMM; // 填入立即数类型 imm.addr = eip + len; // 找到立即数的地址 imm.data_size = data_size; operand_read(&imm); rm.val = imm.val; operand_write(&rm); // 执行 mov 操作 返回指令长度 return len + data_size / 8; // opcode 长度 + ModR/M 字节扫描长度 + 立即数长度 2017 年 9 月 22 日星期五 Programming Assignment 37

38 NEMU 模拟指令译码和执行 查表得知 mov_i2rm_v 其实是对应操作码为 0xC7 的指令 在实现完 mov_i2rm_v 的函数体之后 1. 把 mov_i2rm_v 在 nemu/include/cpu/instr.h ( 或者自己创建一个 mov.h) 中声明一下 ( 或者在 instr.h 中 include mov.h) 2. 把 mov_i2rm_v 填入 opcode_entry[0xc7] 这个位置, 替换原来的 inv 2017 年 9 月 22 日星期五 Programming Assignment 38

39 NEMU 模拟指令译码和执行 针对这个框架有一些要特别注意的地方 void exec(uint32_t n) { while( n > 0 && nemu_state == NEMU_RUN) { nemu/src/cpu/cpu.c instr_len = exec_inst(); cpu.eip += instr_len; n--; 这一步非常机械, 对于某些指令, 如特殊的 jmp ret 中涉及到跳转到某一个绝对的地址 ( 而非相对下一条指令起始地址的偏移量 ) 时, 要在实现时灵活指定指令长度为 0, 来规避 cpu.eip += instr_len 2017 年 9 月 22 日星期五 Programming Assignment 39

40 NEMU 模拟指令译码和执行 精简指令实现的宏 大量指令操作相同, 只是操作数的类型和长度不同 2017 年 9 月 22 日星期五 Programming Assignment 40

41 NEMU 模拟指令译码和执行 精简指令实现的宏 采用前面所示的方法自然能够写出所有指令的实现 但会涉及到大量重复的代码 于是不断使用 CP( 复制 - 粘贴 ) 大法来进行编码 但是代码复制是很糟糕的! alu_test.c bad example! 你猜我是怎么写错的? 2017 年 9 月 22 日星期五 Programming Assignment 41

42 NEMU 模拟指令译码和执行 精简指令实现的宏 : 许多指令的实现流程固定 1. 声明操作数 OPERAND 2. 设置操作数长度 data_size 3. 根据操作数类型进行解码 decode 4. 进行数据操作 ( 能否同类指令共享, 不同指令区分定制?) 5. 返回指令长度 2017 年 9 月 22 日星期五 Programming Assignment 42

43 NEMU 模拟指令译码和执行 于是在 nemu/include/cpu/instr_helper.h 中我们给出了用于精简指令实现的宏 #define make_instr_impl_1op(inst_name, src_type, suffix) #define make_instr_impl_1op_cc(inst_name, src_type, suffix, cc) #define make_instr_impl_2op(inst_name, src_type, dest_type, suffix) #define make_instr_impl_2op_cc(inst_name, src_type, dest_type, suffix, cc) 还有 decode_data_size 系列 decode_operand 系列 condition 系列 宏在预处理阶段被 gcc 处理, 本质就是字符串替换, 拿右边的替换左边的, 换行必须打上 \ 2017 年 9 月 22 日星期五 Programming Assignment 43

44 NEMU 模拟指令译码和执行 于是在 nemu/include/cpu/instr_helper.h 中我们给出了用于精简指令实现的宏 : 举个例子 指令名称 源操作数类型 长度后缀 目的操作数类型 #define make_instr_impl_2op(inst_name, src_type, dest_type, suffix) \ make_instr_func(concat7(inst_name, _, src_type, 2, dest_type, _, suffix)) {\ // 拼接得到 mov_i2rm_v int len = 1; \ //opcode 占一字节 concat(decode_data_size_, suffix) \ concat3(decode_operand, _, concat3(src_type, 2, dest_type)) \ print_asm_2( ); \ // 打印调试信息 instr_execute_2op(); \ return len; \ make_instr_impl_2op(mov, i, rm, v) 2017 年 9 月 22 日星期五 Programming Assignment 44

45 NEMU 模拟指令译码和执行 于是在 nemu/include/cpu/instr_helper.h 中我们给出了用于精简指令实现的宏 : 举个例子 指令名称 源操作数类型 长度后缀 目的操作数类型 #define make_instr_impl_2op(inst_name, src_type, dest_type, suffix) \ make_instr_func(concat7(inst_name, _, src_type, 2, dest_type, _, suffix)) {\ // 拼接得到 mov_i2rm_v int len = 1; \ //opcode 占一字节 concat(decode_data_size_, suffix) \ concat3(decode_operand, _, concat3(src_type, 2, dest_type)) \ print_asm_2( ); \ // 打印调试信息 instr_execute_2op(); \ return len; \ #define decode_data_size_v opr_src.data_size = opr_dest.data_size = data_size; 两个全局 OPERAND 类型的变量, 免去创建局部变量的开销 make_instr_impl_2op(mov, i, rm, v) 2017 年 9 月 22 日星期五 Programming Assignment 45

46 NEMU 模拟指令译码和执行 于是在 nemu/include/cpu/instr_helper.h 中我们给出了用于精简指令实现的宏 : 举个例子 #define make_instr_impl_2op(inst_name, src_type, dest_type, suffix) \ make_instr_func(concat7(inst_name, _, src_type, 2, dest_type, _, suffix)) {\ // 拼接得到 mov_i2rm_v int len = 1; \ //opcode 占一字节 concat(decode_data_size_, suffix) \ concat3(decode_operand, _, concat3(src_type, 2, dest_type)) \ print_asm_2( ); \ // 打印调试信息 指令名称 源操作数类型 instr_execute_2op(); \ return len; \ 解码两个操作数并增加 len 长度后缀 目的操作数类型 #define decode_operand_i2rm \ len += modrm_rm(eip + 1, &opr_dest); \ opr_src.type = OPR_IMM; \ opr_src.sreg = SREG_CS; \ opr_src.addr = eip + len; \ len += opr_src.data_size / 8; make_instr_impl_2op(mov, i, rm, v) 2017 年 9 月 22 日星期五 Programming Assignment 46

47 NEMU 模拟指令译码和执行 于是在 nemu/include/cpu/instr_helper.h 中我们给出了用于精简指令实现的宏 : 举个例子 #define make_instr_impl_2op(inst_name, src_type, dest_type, suffix) \ make_instr_func(concat7(inst_name, _, src_type, 2, dest_type, _, suffix)) {\ // 拼接得到 mov_i2rm_v int len = 1; \ //opcode 占一字节 concat(decode_data_size_, suffix) \ concat3(decode_operand, _, concat3(src_type, 2, dest_type)) \ print_asm_2( ); \ // 打印调试信息 instr_execute_2op(); \ return len; \ 指令名称 源操作数类型 目的操作数类型 执行函数写在 mov.c 中, 根据指令的具体操作来实现,static 不可少! 长度后缀 static void instr_execute_2op() { operand_read(&opr_src); opr_dest.val = opr_src.val; operand_write(&opr_dest); make_instr_impl_2op(mov, i, rm, v) 2017 年 9 月 22 日星期五 Programming Assignment 47

48 NEMU 模拟指令译码和执行 于是在 nemu/include/cpu/instr_helper.h 中我们给出了用于精简指令实现的宏 : 举个例子 static void instr_execute_2op() { operand_read(&opr_src); opr_dest.val = opr_src.val; operand_write(&opr_dest); nemu/src/cpu/instr/mov.c make_instr_impl_2op(mov, r, rm, b) make_instr_impl_2op(mov, r, rm, v) make_instr_impl_2op(mov, rm, r, b) make_instr_impl_2op(mov, rm, r, v) make_instr_impl_2op(mov, i, rm, b) make_instr_impl_2op(mov, i, rm, v) make_instr_impl_2op(mov, i, r, b) make_instr_impl_2op(mov, i, r, v) make_instr_impl_2op(mov, a, o, b) make_instr_impl_2op(mov, a, o, v) make_instr_impl_2op(mov, o, a, b) make_instr_impl_2op(mov, o, a, v) 2017 年 9 月 22 日星期五 Programming Assignment 48

49 NEMU 模拟指令译码和执行 于是在 nemu/include/cpu/instr_helper.h 中我们给出了用于精简指令实现的宏, 一些实用信息 ( 详细用法参阅教程, 比较详尽 ) #define make_instr_impl_2op(inst_name, src_type, dest_type, suffix) inst_name 就是指令的名称 :mov,add,sub, src_type 和 dest_type 是源和目的操作数类型, 与 decode_operand 系列宏一致 : rm 寄存器或内存地址 对应手册 E 类型 r 寄存器地址 对应手册 G 类型 i 立即数 对应手册 I 类型 m 内存地址 差不多对应手册 M 类型 a 根据操作数长度对应 al, ax, eax 手册里没有 c 根据操作数长度对应 cl, cx, ecx 手册里没有 o 偏移量 差不多对用手册里的 O 类型 suffix 是操作数长度后缀, 与 decode_data_size 系列宏一致 : b, w, l, v 8,16,32,16/32 位 bv 源操作数为 8 位, 目的操作数为 16/32 位, 特殊指令用到 short, near jmp 指令用到, 分别指代 8 位和 32 位 你可以根据实际需要添加其他的宏或改写已有的宏 2017 年 9 月 22 日星期五 Programming Assignment 49

50 NEMU 模拟指令译码和执行 指令循环 : 一条接一条的执行指令 怎么从 main 走到这个函数的? 我们最后讲 void exec(uint32_t n) { while( n > 0 && nemu_state == NEMU_RUN) { 循环执行指令 instr_len = exec_inst(); cpu.eip += instr_len; n--; 执行一条指令 假设此时指令已经在内存中排好了, EIP 初始化为第一条指令的地址, 谁干的? 我们最后讲 nemu/src/cpu/cpu.c 回答最后的问题 int exec_inst() { uint8_t opcode = 0; // get the opcode, 取操作数 opcode = instr_fetch(cpu.eip, 1); // instruction decode and execution, 执行这条指令 int len = opcode_entry[opcode](cpu.eip, opcode); return len; // 返回指令长度 2017 年 9 月 22 日星期五 Programming Assignment 50

51 NEMU 运行测试用例 2017 年 9 月 22 日星期五 Programming Assignment 51

52 NEMU 运行测试用例 从 make run 说起 目标 Makefile nemu: $(call git_commit, "nemu") cd nemu && make run: nemu do_not_call_me_testcase $(call git_commit, "run")./nemu/nemu -run mov Makefile 中的第一个目标, 当命令不带目标 ( 就单纯 make) 时, 默认执行的目标 前提依赖 ( 应先于该目标达成的目标 ) 在前提依赖被满足的情况下, 实现目标的额外步骤 2017 年 9 月 22 日星期五 Programming Assignment 52

53 NEMU 运行测试用例 从 make run 说起 目标 Makefile nemu: $(call git_commit, "nemu") cd nemu && make run: nemu do_not_call_me_testcase $(call git_commit, "run")./nemu/nemu -run mov 前提依赖 ( 编译 nemu 和 testcase) 1. 打上 git 记录 2. 执行./nemu/nemu -run mov 其中 mov 是测试用例的名称, 对应 testcase/src/ 里面测试用例源文件的文件名 2017 年 9 月 22 日星期五 Programming Assignment 53

54 NEMU 运行测试用例 从 make run 说起 执行./nemu/nemu -run mov nemu/src/main.c int main(int argc, char* argv[]) { if(argc == 1) { reg_test(); alu_test(); fpu_test(); return 0; /* Read the arguments */ if(argc == 3) { if(strcmp(argv[1], "-run")) { printf("error: %s %s %s\n", argv[0], argv[1], argv[2]); printf("usage: nemu -run <testcase>\n"); return 0; 内存镜像路径 elf 文件路径 ( 现在不管 ) strcpy(image_path, "./testcase/bin/"); strcat(image_path, argv[2]); strcat(image_path, ".img"); strcpy(elf_path, "./testcase/bin/"); strcat(elf_path, argv[2]); single_run(); 2017 年 9 月 22 日星期五 Programming Assignment 54

55 NEMU 运行测试用例 从 make run 说起 执行./nemu/nemu -run mov nemu/src/main.c static void single_run() { restart(init_eip); load_image(image_path, LOAD_OFF); load_image(elf_path, 0); ui_mainloop(autorun); 2017 年 9 月 22 日星期五 Programming Assignment 55

56 NEMU 运行测试用例 从 make run 说起 执行./nemu/nemu -run mov cpu.c single_run() -> restart() -> init_cpu() { cpu.eip = init_eip; // 0x30000 和 testcase/makefile 中 -Ttext=0x30000 配合 // 同时和 load_image(image_path, LOAD_OFF) 的位置配合 cpu.esp = (128 << 20) - 16; Initial EIP 指向第一条指令 栈从尾部开始向前长 Physical Address v 0x0 0x30000 EIP 初始值与 load_image 位置保持一致 0x Testcase ELF File ~ Testcase Binary ~ < ---- RAM Disk ----> < Physical Memory > 带有 RAM Disk 时的内存划分方式 single_run() -> load_image () { fread( ); main.c PA 2-1 只看绿线 PA 2-2 看蓝线 2017 年 9 月 22 日星期五 Programming Assignment 56

57 NEMU 运行测试用例 从 make run 说起 执行./nemu/nemu -run mov nemu/src/main.c static void single_run() { restart(init_eip); load_image(image_path, LOAD_OFF); load_image(elf_path, 0); ui_mainloop(autorun); 2017 年 9 月 22 日星期五 Programming Assignment 57

58 NEMU 运行测试用例 从 make run 说起 执行./nemu/nemu -run mov 进入 ui_mainloop(),autorun 为 false 进入字符交互界面, 为 true 则不进入交互界面, 自动开始运行 (make test 就这么实现 ) main() { single_run(); main.c single_run() { // restart() 初始化 EIP // load_image() 绿的那个把指令在内从中排好 ui_mainloop(); void ui_mainloop(bool autorun) { c 命令 while(true) { 通过 readline 拿到用户命令查 cmd_table 看是什么命令调用命令对应的 handler nemu/src/monitor/ui.c cmd_handler(cmd_c) { // execute the program exec(-1); // 进入 cpu.c return 0; 其他丰富的调试命令参见教程 或阅读源代码,EXPR 要用起来参见教程可选任务 PA 年 9 月 22 日星期五 Programming Assignment 58

59 实验目标 大佬! PA 2-1 提交截止时间 2017 年 10 月 19 日 24 时 一个月的时间 有时间可以 ( 应该 ) 先做 PA 年 9 月 22 日星期五 Programming Assignment 59

60 PA 2-1 到此结束 祝大家学习快乐, 身心健康! 欢迎大家踊跃参加问卷调查 ( 量表一 二 三到 PA 2 截止时做一次, 如果 PA 2-1 截止的时候也能做一次最好 )

CC213

CC213 : (Ken-Yi Lee), E-mail: feis.tw@gmail.com 49 [P.51] C/C++ [P.52] [P.53] [P.55] (int) [P.57] (float/double) [P.58] printf scanf [P.59] [P.61] ( / ) [P.62] (char) [P.65] : +-*/% [P.67] : = [P.68] : ,

More information

chap07.key

chap07.key #include void two(); void three(); int main() printf("i'm in main.\n"); two(); return 0; void two() printf("i'm in two.\n"); three(); void three() printf("i'm in three.\n"); void, int 标识符逗号分隔,

More information

C/C++ - 文件IO

C/C++ - 文件IO C/C++ IO Table of contents 1. 2. 3. 4. 1 C ASCII ASCII ASCII 2 10000 00100111 00010000 31H, 30H, 30H, 30H, 30H 1, 0, 0, 0, 0 ASCII 3 4 5 UNIX ANSI C 5 FILE FILE 6 stdio.h typedef struct { int level ;

More information

int *p int a 0x00C7 0x00C7 0x00C int I[2], *pi = &I[0]; pi++; char C[2], *pc = &C[0]; pc++; float F[2], *pf = &F[0]; pf++;

int *p int a 0x00C7 0x00C7 0x00C int I[2], *pi = &I[0]; pi++; char C[2], *pc = &C[0]; pc++; float F[2], *pf = &F[0]; pf++; Memory & Pointer trio@seu.edu.cn 2.1 2.1.1 1 int *p int a 0x00C7 0x00C7 0x00C7 2.1.2 2 int I[2], *pi = &I[0]; pi++; char C[2], *pc = &C[0]; pc++; float F[2], *pf = &F[0]; pf++; 2.1.3 1. 2. 3. 3 int A,

More information

1 CPU interrupt INT trap CPU exception

1 CPU interrupt INT trap CPU exception 1 CPU interrupt INT trap CPU exception 2 X86 CPU gate 64 16 1 2 5 8 16 16 P DPL 00101 TSS 101 DPL P 1 64 16 1 2 1 1 3 3 5 16 16 16 P DPL 0 D 000 16 110 111 100 D 1=32 0=16 DPL P 1 INT DPL1>=CPL>=DPL CPU

More information

FY.DOC

FY.DOC 高 职 高 专 21 世 纪 规 划 教 材 C++ 程 序 设 计 邓 振 杰 主 编 贾 振 华 孟 庆 敏 副 主 编 人 民 邮 电 出 版 社 内 容 提 要 本 书 系 统 地 介 绍 C++ 语 言 的 基 本 概 念 基 本 语 法 和 编 程 方 法, 深 入 浅 出 地 讲 述 C++ 语 言 面 向 对 象 的 重 要 特 征 : 类 和 对 象 抽 象 封 装 继 承 等 主

More information

C 1

C 1 C homepage: xpzhangme 2018 5 30 C 1 C min(x, y) double C // min c # include # include double min ( double x, double y); int main ( int argc, char * argv []) { double x, y; if( argc!=

More information

Don t panic :-) 2

Don t panic :-) 2 PA 2018 秋季实验指导 本教程是针对 2018 年秋季 计算机系统基础 Programming Assignment(PA) 实验的指导 本教程所使用的框架代码可以通过以下方式获取 git clone https://github.com/ics-pa/pa2018_spring.git 拿到框架代码后, 请注意以下几点 ( 重要 ) 1) 修改 Makefile.git 中的 STU_ID

More information

untitled

untitled A, 3+A printf( ABCDEF ) 3+ printf( ABCDEF ) 2.1 C++ main main main) * ( ) ( ) [ ].* ->* ()[] [][] ** *& char (f)(int); ( ) (f) (f) f (int) f int char f char f(int) (f) char (*f)(int); (*f) (int) (

More information

华恒家庭网关方案

华恒家庭网关方案 LINUX V1.5 1 2 1 2 LINUX WINDOWS PC VC LINUX WINDOWS LINUX 90% GUI LINUX C 3 REDHAT 9 LINUX PC TFTP/NFS http://www.hhcn.com/chinese/embedlinux-res.html minicom NFS mount C HHARM9-EDU 1 LINUX HHARM9-EDU

More information

Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.06.doc

Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.06.doc 2 5 8 11 0 13 1. 13 2. 15 3. 18 1 23 1. 23 2. 26 3. 28 2 36 1. 36 2. 39 3. 42 4. 44 5. 49 6. 51 3 57 1. 57 2. 60 3. 64 4. 66 5. 70 6. 75 7. 83 8. 85 9. 88 10. 98 11. 103 12. 108 13. 112 4 115 1. 115 2.

More information

How to Debug Tuxedo Server printf( Input data is: %s, inputstr); fprintf(stdout, Input data is %s, inputstr); fprintf(stderr, Input data is %s, inputstr); printf( Return data is: %s, outputstr); tpreturn(tpsuccess,

More information

untitled

untitled 不 料 料 例 : ( 料 ) 串 度 8 年 數 串 度 4 串 度 數 數 9- ( ) 利 數 struct { ; ; 數 struct 數 ; 9-2 數 利 數 C struct 數 ; C++ 數 ; struct 省略 9-3 例 ( 料 例 ) struct people{ char name[]; int age; char address[4]; char phone[]; int

More information

新・明解C言語入門編『索引』

新・明解C言語入門編『索引』 !... 75!=... 48 "... 234 " "... 9, 84, 240 #define... 118, 213 #include... 148 %... 23 %... 23, 24 %%... 23 %d... 4 %f... 29 %ld... 177 %lf... 31 %lu... 177 %o... 196 %p... 262 %s... 242, 244 %u... 177

More information

ROP_bamboofox.key

ROP_bamboofox.key ROP Return Oriented Programming Lays @ BambooFox Who Am I Lays / L4ys / 累死 - l4ys.tw Reverse Engineering BambooFox / HITCON Outline Buffer Overflow ret2libc / ret2text Return Oriented Programming Payload

More information

C语言的应用.PDF

C语言的应用.PDF AVR C 9 1 AVR C IAR C, *.HEX, C,,! C, > 9.1 AVR C MCU,, AVR?! IAR AVR / IAR 32 ALU 1KBytes - 8MBytes (SPM ) 16 MBytes C C *var1, *var2; *var1++ = *--var2; AVR C 9 2 LD R16,-X ST Z+,R16 Auto (local

More information

<4D F736F F D20B5DAC8FDCBC4D5C2D7F7D2B5B4F0B0B82E646F63>

<4D F736F F D20B5DAC8FDCBC4D5C2D7F7D2B5B4F0B0B82E646F63> 第三章 Q3 1 1. 省略了 I/O 操作的复杂逻辑, 易实现, 耗费低 ; 2. 可以利用丰富的内存寻址模式实现灵活的 I/O 操作 Q3 2 假设存储单元 ds1 处寄存器地址为 0x2000, 代码如下 #define ds1 0x2000 while ( *ds1 == 0 ) ; Q3 3 假设设备 (dev1) 中有两个寄存器 ds1 和 dd1,dev1 的地址为 0x1000,ds1

More information

A Preliminary Implementation of Linux Kernel Virus and Process Hiding

A Preliminary Implementation of Linux Kernel Virus and Process Hiding 邵 俊 儒 翁 健 吉 妍 年 月 日 学 号 学 号 学 号 摘 要 结 合 课 堂 知 识 我 们 设 计 了 一 个 内 核 病 毒 该 病 毒 同 时 具 有 木 马 的 自 动 性 的 隐 蔽 性 和 蠕 虫 的 感 染 能 力 该 病 毒 获 得 权 限 后 会 自 动 将 自 身 加 入 内 核 模 块 中 劫 持 的 系 统 调 用 并 通 过 简 单 的 方 法 实 现 自 身 的

More information

C/C++语言 - C/C++数据

C/C++语言 - C/C++数据 C/C++ C/C++ Table of contents 1. 2. 3. 4. char 5. 1 C = 5 (F 32). 9 F C 2 1 // fal2cel. c: Convert Fah temperature to Cel temperature 2 # include < stdio.h> 3 int main ( void ) 4 { 5 float fah, cel ;

More information

新版 明解C++入門編

新版 明解C++入門編 511!... 43, 85!=... 42 "... 118 " "... 337 " "... 8, 290 #... 71 #... 413 #define... 128, 236, 413 #endif... 412 #ifndef... 412 #if... 412 #include... 6, 337 #undef... 413 %... 23, 27 %=... 97 &... 243,

More information

C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1

C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1 C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 月 3 日 1 1 INPUTOUTPUT 1 InputOutput 题目描述 用 cin 输入你的姓名 ( 没有空格 ) 和年龄 ( 整数 ), 并用 cout 输出 输入输出符合以下范例 输入 master 999 输出 I am master, 999 years old. 注意 "," 后面有一个空格,"." 结束,

More information

untitled

untitled 1 5 IBM Intel 1. IBM 第 1/175 页 第 2/175 页 第 3/175 页 80 第 4/175 页 2. IBM 第 5/175 页 3. (1) 第 6/175 页 第 7/175 页 第 8/175 页 = = 第 9/175 页 = = = = = 第 10/175 页 = = = = = = = = 3. (2) 第 11/175 页 第 12/175 页 第 13/175

More information

C C

C C C C 2017 3 8 1. 2. 3. 4. char 5. 2/101 C 1. 3/101 C C = 5 (F 32). 9 F C 4/101 C 1 // fal2cel.c: Convert Fah temperature to Cel temperature 2 #include 3 int main(void) 4 { 5 float fah, cel; 6 printf("please

More information

51 C 51 isp 10 C PCB C C C C KEIL

51 C 51 isp 10   C   PCB C C C C KEIL http://wwwispdowncom 51 C " + + " 51 AT89S51 In-System-Programming ISP 10 io 244 CPLD ATMEL PIC CPLD/FPGA ARM9 ISP http://wwwispdowncom/showoneproductasp?productid=15 51 C C C C C ispdown http://wwwispdowncom

More information

学习MSP430单片机推荐参考书

学习MSP430单片机推荐参考书 MSP430 16 MSP430 C MSP430 C MSP430 FLASH 16 1 CPU 16 ALU 16 PC SP SR R4~R15 2 3 00-FFH 100-1FFH 4 5 1 2 51 24 27 6 1 2 3 4 5 6 4 12 SR SP SR CPU SR CPU C Z N GIE CPUOff CPU OscOff SCG0 SCG1 CPU EXIT SP

More information

_汪_文前新ok[3.1].doc

_汪_文前新ok[3.1].doc 普 通 高 校 本 科 计 算 机 专 业 特 色 教 材 精 选 四 川 大 学 计 算 机 学 院 国 家 示 范 性 软 件 学 院 精 品 课 程 基 金 青 年 基 金 资 助 项 目 C 语 言 程 序 设 计 (C99 版 ) 陈 良 银 游 洪 跃 李 旭 伟 主 编 李 志 蜀 唐 宁 九 李 涛 主 审 清 华 大 学 出 版 社 北 京 i 内 容 简 介 本 教 材 面 向

More information

Linux kernel exploit研究和探索

Linux kernel exploit研究和探索 Linux kernel exploit DOC alert7 PPT e4gle 2002-12-2 1 2002-12-2 2 Linux kernel exploit kernel exploit exploit exploit exploit (Kernel Buffer Overflow) (Kernel

More information

6 C51 ANSI C Turbo C C51 Turbo C C51 C51 C51 C51 C51 C51 C51 C51 C C C51 C51 ANSI C MCS-51 C51 ANSI C C C51 bit Byte bit sbit

6 C51 ANSI C Turbo C C51 Turbo C C51 C51 C51 C51 C51 C51 C51 C51 C C C51 C51 ANSI C MCS-51 C51 ANSI C C C51 bit Byte bit sbit 6 C51 ANSI C Turbo C C51 Turbo C C51 C51 C51 C51 C51 C51 C51 C51 C51 6.1 C51 6.1.1 C51 C51 ANSI C MCS-51 C51 ANSI C C51 6.1 6.1 C51 bit Byte bit sbit 1 0 1 unsigned char 8 1 0 255 Signed char 8 11 128

More information

1 Project New Project 1 2 Windows 1 3 N C test Windows uv2 KEIL uvision2 1 2 New Project Ateml AT89C AT89C51 3 KEIL Demo C C File

1 Project New Project 1 2 Windows 1 3 N C test Windows uv2 KEIL uvision2 1 2 New Project Ateml AT89C AT89C51 3 KEIL Demo C C File 51 C 51 51 C C C C C C * 2003-3-30 pnzwzw@163.com C C C C KEIL uvision2 MCS51 PLM C VC++ 51 KEIL51 KEIL51 KEIL51 KEIL 2K DEMO C KEIL KEIL51 P 1 1 1 1-1 - 1 Project New Project 1 2 Windows 1 3 N C test

More information

C++ 程式設計

C++ 程式設計 C C 料, 數, - 列 串 理 列 main 數串列 什 pointer) 數, 數, 數 數 省 不 不, 數 (1) 數, 不 數 * 料 * 數 int *int_ptr; char *ch_ptr; float *float_ptr; double *double_ptr; 數 (2) int i=3; int *ptr; ptr=&i; 1000 1012 ptr 數, 數 1004

More information

OOP with Java 通知 Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢 学习使用文本编辑器 学习使用 cmd: Power shell 阅读参考资料

OOP with Java 通知 Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢   学习使用文本编辑器 学习使用 cmd: Power shell 阅读参考资料 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢 Email: 51141201063@ecnu.cn 学习使用文本编辑器 学习使用 cmd: Power shell 阅读参考资料 OOP with Java Java 类型 引用 不可变类型 对象存储位置 作用域 OOP

More information

幻灯片 1

幻灯片 1 3 8086 Tel:2656809 tjx@csu.edu.cn 2005-9-14 1 2005-9-14 2 8086 8 8086 8086 7 2005-9-14 3 PC 2005-9-14 4 2005-9-14 5 81616 2005-9-14 6 [ ] MOV AX, 3064H AX=3064H 16AX OP 64H 30H 2005-9-14 7 16 AX BX CX

More information

static struct file_operations gpio_ctl_fops={ ioctl: gpio_ctl_ioctl, open : gpio_open, release: gpio_release, ; #defineled1_on() (GPBDAT &= ~0x1) #def

static struct file_operations gpio_ctl_fops={ ioctl: gpio_ctl_ioctl, open : gpio_open, release: gpio_release, ; #defineled1_on() (GPBDAT &= ~0x1) #def Kaise s 2410 Board setting [1]. Device Driver Device Driver Linux s Kernel ARM s kernel s3c2410_kernel2.4.18_r1.1_change.tar.bz2 /usr/src (1) #cd /usr/src (2) #tar xfj s3c2410_kernel2.4.18_r1.1_change.tar.bz2

More information

1 LINUX IDE Emacs gcc gdb Emacs + gcc + gdb IDE Emacs IDE C Emacs Emacs IDE ICE Integrated Computing Environment Emacs Unix Linux Emacs Emacs Emacs Un

1 LINUX IDE Emacs gcc gdb Emacs + gcc + gdb IDE Emacs IDE C Emacs Emacs IDE ICE Integrated Computing Environment Emacs Unix Linux Emacs Emacs Emacs Un Linux C July 27, 2016 Contents 1 Linux IDE 1 2 GCC 3 2.1 hello.c hello.exe........................... 5 2.2............................... 9 2.2.1 -Wall................................ 9 2.2.2 -E..................................

More information

untitled

untitled CPU!! 00-11-8 Liping zhang, Tsinghua 1 : ADD(r1, r, r) CMPLEC(r, 5, r0) MUL(r1, r, r) SUB(r1, r, r5) ADD r, ( ) r CMP. CMP r.. t t + 1 t + t + t + t + 5 t + 6 IF( ) ADD CMP MUL SUB RF NOP ADD CMP MUL SUB

More information

untitled

untitled 8086/8088 CIP /. 2004.8 ISBN 7-03-014239-X.... TP313 CIP 2004 086019 16 100717 http://www.sciencep.com * 2004 8 2004 8 1 5 500 787 1092 1/16 16 1/2 391 000 1 2 ii 1 2 CAI CAI 3 To the teacher To the student

More information

Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.07.doc

Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.07.doc 2 5 8 11 0 1. 13 2. 15 3. 18 1 1. 22 2. 25 3. 27 2 1. 35 2. 38 3. 41 4. 43 5. 48 6. 50 3 1. 56 2. 59 3. 63 4. 65 5. 69 13 22 35 56 6. 74 7. 82 8. 84 9. 87 10. 97 11. 102 12. 107 13. 111 4 114 1. 114 2.

More information

Oracle Solaris Studio makefile C C++ Fortran IDE Solaris Linux C/C++/Fortran IDE "Project Properties" IDE makefile 1.

Oracle Solaris Studio makefile C C++ Fortran IDE Solaris Linux C/C++/Fortran IDE Project Properties IDE makefile 1. Oracle Solaris Studio 12.2 IDE 2010 9 2 8 9 10 11 13 20 26 28 30 32 33 Oracle Solaris Studio makefile C C++ Fortran IDE Solaris Linux C/C++/Fortran IDE "Project Properties" IDE makefile 1. "File" > "New

More information

C

C C 14 2017 5 31 1. 2. 3. 4. 5. 2/101 C 1. ( ) 4/101 C C ASCII ASCII ASCII 5/101 C 10000 00100111 00010000 ASCII 10000 31H 30H 30H 30H 30H 1 0 0 0 0 0 ASCII 6/101 C 7/101 C ( ) ( ) 8/101 C UNIX ANSI C 9/101

More information

目录

目录 ALTERA_CPLD... 3 11SY_03091... 3 12SY_03091...4....5 21 5 22...8 23..10 24..12 25..13..17 3 1EPM7128SLC.......17 3 2EPM7032SLC.......18 33HT46R47......19..20 41..20 42. 43..26..27 5151DEMO I/O...27 52A/D89C51...28

More information

科学计算的语言-FORTRAN95

科学计算的语言-FORTRAN95 科 学 计 算 的 语 言 -FORTRAN95 目 录 第 一 篇 闲 话 第 1 章 目 的 是 计 算 第 2 章 FORTRAN95 如 何 描 述 计 算 第 3 章 FORTRAN 的 编 译 系 统 第 二 篇 计 算 的 叙 述 第 4 章 FORTRAN95 语 言 的 形 貌 第 5 章 准 备 数 据 第 6 章 构 造 数 据 第 7 章 声 明 数 据 第 8 章 构 造

More information

<4D6963726F736F667420576F7264202D20B9F9B0EABBCDBBAFAB48DEB3B4C1A5BDB3F8A7692E646F63>

<4D6963726F736F667420576F7264202D20B9F9B0EABBCDBBAFAB48DEB3B4C1A5BDB3F8A7692E646F63> 臺 北 市 立 松 山 高 級 工 農 職 業 學 校 資 訊 科 專 題 製 作 報 告 題 目 : 反 彈 空 間 指 導 老 師 : 余 耀 銘 學 生 : 廖 國 銓 趙 信 瑋 中 華 民 國 102 年 5 月 摘 要 在 這 高 速 科 技 的 起 飛 下, 科 技 都 建 立 起 於 基 礎, 有 些 人 把 這 基 礎 轉 為 理 論, 教 給 大 眾 學 習 ; 有 些 人 利

More information

, 7, Windows,,,, : ,,,, ;,, ( CIP) /,,. : ;, ( 21 ) ISBN : -. TP CIP ( 2005) 1

, 7, Windows,,,, : ,,,, ;,, ( CIP) /,,. : ;, ( 21 ) ISBN : -. TP CIP ( 2005) 1 21 , 7, Windows,,,, : 010-62782989 13501256678 13801310933,,,, ;,, ( CIP) /,,. : ;, 2005. 11 ( 21 ) ISBN 7-81082 - 634-4... - : -. TP316-44 CIP ( 2005) 123583 : : : : 100084 : 010-62776969 : 100044 : 010-51686414

More information

Microsoft PowerPoint - ds-1.ppt [兼容模式]

Microsoft PowerPoint - ds-1.ppt [兼容模式] http://jwc..edu.cn/jxgl/ HomePage/Default.asp 2 说 明 总 学 时 : 72( 学 时 )= 56( 课 时 )+ 16( 实 验 ) 行 课 时 间 : 第 1 ~14 周 周 学 时 : 平 均 每 周 4 学 时 上 机 安 排 待 定 考 试 时 间 : 课 程 束 第 8 11 12 章 的 内 容 为 自 学 内 容 ; 目 录 中 标 有

More information

06721 main() lock pick proc() restart() [2][4] MINIX minix2.0 GDT, IDT irq table[] CPU CPU CPU CPU (IDTR) idt[] CPU _hwint00:! Interrupt

06721 main() lock pick proc() restart() [2][4] MINIX minix2.0 GDT, IDT irq table[] CPU CPU CPU CPU (IDTR) idt[] CPU _hwint00:! Interrupt MINIX ( 730000) ( 730000) MINIX MINIX2.0 MINIX : MINIX TP3 1 MINIX UNIX Tanenbaum UNIX MINIX LINUX MINIX MINIX MINIX1.0 UNIX V7 MINIX2.0[3] POSIX MINIX3 MINIX Gabriel A. Wainer 1994-1995 [5] 1998 I/O 2002

More information

mvc

mvc Build an application Tutor : Michael Pan Application Source codes - - Frameworks Xib files - - Resources - ( ) info.plist - UIKit Framework UIApplication Event status bar, icon... delegation [UIApplication

More information

Microsoft Word - 01.DOC

Microsoft Word - 01.DOC 第 1 章 JavaScript 简 介 JavaScript 是 NetScape 公 司 为 Navigator 浏 览 器 开 发 的, 是 写 在 HTML 文 件 中 的 一 种 脚 本 语 言, 能 实 现 网 页 内 容 的 交 互 显 示 当 用 户 在 客 户 端 显 示 该 网 页 时, 浏 览 器 就 会 执 行 JavaScript 程 序, 用 户 通 过 交 互 式 的

More information

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数 复习 类的复用 组合 (composition): has-a 关系 class MyType { public int i; public double d; public char c; public void set(double

More information

Microsoft PowerPoint - C15_LECTURE_NOTE_04.ppt

Microsoft PowerPoint - C15_LECTURE_NOTE_04.ppt MACHINE LANGUAGE CODING AND THE DEBUG SOFTWARE DEVELOPMENT PROGRAM OF THE PC General instruction format for machine code 611 37100 微處理機原理與應用 Lecture 04-4 MACHINE LANGUAGE CODING AND THE DEBUG SOFTWARE

More information

Microsoft PowerPoint - C15_LECTURE_NOTE_04.ppt

Microsoft PowerPoint - C15_LECTURE_NOTE_04.ppt MACHINE LANGUAGE CODING AND THE DEBUG SOFTWARE DEVELOPMENT PROGRAM OF THE PC MACHINE LANGUAGE CODING AND THE DEBUG SOFTWARE DEVELOPMENT PROGRAM OF THE PC 4.1 Converting Assembly Language Instructions to

More information

ebook14-4

ebook14-4 4 TINY LL(1) First F o l l o w t o p - d o w n 3 3. 3 backtracking parser predictive parser recursive-descent parsing L L ( 1 ) LL(1) parsing L L ( 1 ) L L ( 1 ) 1 L 2 L 1 L L ( k ) k L L ( 1 ) F i r s

More information

1 4 1.1 4 1.2..4 2..4 2.1..4 3.4 3.1 Java.5 3.1.1..5 3.1.2 5 3.1.3 6 4.6 4.1 6 4.2.6 5 7 5.1..8 5.1.1 8 5.1.2..8 5.1.3..8 5.1.4..9 5.2..9 6.10 6.1.10

1 4 1.1 4 1.2..4 2..4 2.1..4 3.4 3.1 Java.5 3.1.1..5 3.1.2 5 3.1.3 6 4.6 4.1 6 4.2.6 5 7 5.1..8 5.1.1 8 5.1.2..8 5.1.3..8 5.1.4..9 5.2..9 6.10 6.1.10 Java V1.0.1 2007 4 10 1 4 1.1 4 1.2..4 2..4 2.1..4 3.4 3.1 Java.5 3.1.1..5 3.1.2 5 3.1.3 6 4.6 4.1 6 4.2.6 5 7 5.1..8 5.1.1 8 5.1.2..8 5.1.3..8 5.1.4..9 5.2..9 6.10 6.1.10 6.2.10 6.3..10 6.4 11 7.12 7.1

More information

第7章-并行计算.ppt

第7章-并行计算.ppt EFEP90 10CDMP3 CD t 0 t 0 To pull a bigger wagon, it is easier to add more oxen than to grow a gigantic ox 10t 0 t 0 n p Ts Tp if E(n, p) < 1 p, then T (n) < T (n, p) s p S(n,p) = p : f(x)=sin(cos(x))

More information

Microsoft Word - 11.doc

Microsoft Word - 11.doc 除 錯 技 巧 您 將 於 本 章 學 到 以 下 各 項 : 如 何 在 Visual C++ 2010 的 除 錯 工 具 控 制 下 執 行 程 式? 如 何 逐 步 地 執 行 程 式 的 敘 述? 如 何 監 看 或 改 變 程 式 中 的 變 數 值? 如 何 監 看 程 式 中 計 算 式 的 值? 何 謂 Call Stack? 何 謂 診 斷 器 (assertion)? 如 何

More information

,768 32,767 32K JMP Jnnn (386+) LOOP CALL [Label:] JMP short/near/far address L10: jmp jmp L20: L10 L20

,768 32,767 32K JMP Jnnn (386+) LOOP CALL [Label:] JMP short/near/far address L10: jmp jmp L20: L10 L20 (Jump) (Loop) (Conditional jump) CMP CALL AND SAR/SHR TEST JMP NOT SAL/SHL Jnnn* OR RCR/ROR LOOP XOR RCL/ROL RETn * nnn, JNE JL -128 127-32,768 32,767 32K JMP Jnnn (386+) LOOP CALL [Label:] JMP short/near/far

More information

穨control.PDF

穨control.PDF TCP congestion control yhmiu Outline Congestion control algorithms Purpose of RFC2581 Purpose of RFC2582 TCP SS-DR 1998 TCP Extensions RFC1072 1988 SACK RFC2018 1996 FACK 1996 Rate-Halving 1997 OldTahoe

More information

<4D6963726F736F667420576F7264202D20C7B6C8EBCABDCFB5CDB3C9E8BCC6CAA6B0B8C0FDB5BCD1A75FD1F9D5C22E646F63>

<4D6963726F736F667420576F7264202D20C7B6C8EBCABDCFB5CDB3C9E8BCC6CAA6B0B8C0FDB5BCD1A75FD1F9D5C22E646F63> 因 为 路 过 你 的 路, 因 为 苦 过 你 的 苦, 所 以 快 乐 着 你 的 快 乐, 追 逐 着 你 的 追 逐 内 容 简 介 本 书 根 据 2005 年 下 半 年 实 施 的 全 国 计 算 机 技 术 与 软 件 专 业 技 术 资 格 ( 水 平 ) 考 试 嵌 入 式 系 统 设 计 师 级 考 试 大 纲 精 神, 在 深 入 研 究 历 年 计 算 机 技 术 与 软

More information

untitled

untitled 1 DBF (READDBF.C)... 1 2 (filetest.c)...2 3 (mousetes.c)...3 4 (painttes.c)...5 5 (dirtest.c)...9 6 (list.c)...9 1 dbf (readdbf.c) /* dbf */ #include int rf,k,reclen,addr,*p1; long brec,erec,i,j,recnum,*p2;

More information

第 15 章 程 式 編 写 語 言 15.1 程 式 編 写 語 言 的 角 色 程 式 編 寫 語 言 是 程 式 編 寫 員 與 電 腦 溝 通 的 界 面 語 法 是 一 組 規 則 讓 程 式 編 寫 員 將 字 詞 集 合 起 來 電 腦 是 處 理 位 元 和 字 節 的 機 器, 與

第 15 章 程 式 編 写 語 言 15.1 程 式 編 写 語 言 的 角 色 程 式 編 寫 語 言 是 程 式 編 寫 員 與 電 腦 溝 通 的 界 面 語 法 是 一 組 規 則 讓 程 式 編 寫 員 將 字 詞 集 合 起 來 電 腦 是 處 理 位 元 和 字 節 的 機 器, 與 程 式 編 写 語 言 在 完 成 這 章 後, 你 將 能 夠 了 解 程 式 編 写 語 言 的 功 能 了 解 高 階 語 言 和 低 階 語 言 之 間 的 分 別 知 道 翻 譯 程 式 的 意 義 和 能 夠 把 翻 譯 程 式 分 類 為 : 匯 編 程 式 編 譯 程 式 和 解 譯 程 式 認 識 不 同 翻 譯 程 式 的 優 點 和 缺 點 程 式 是 指 揮 電 腦 的 指

More information

PowerPoint 演示文稿

PowerPoint 演示文稿 计算机系统基础 Programming Assignment PA 2 程序的执行 ( 第三课 ) PA 2-3.1 表达式求值 2017 年 11 月 06 日 monitor 与表达式求值 monitor 是 NEMU 中用于调试的功能组件 通过字符命令界面 (command line interface, CLI) 来提供调试功能 运行 nemu/nemu 后的基本流程 入口为 nemu/src/main.c

More information

WWW PHP

WWW PHP WWW PHP 2003 1 2 function function_name (parameter 1, parameter 2, parameter n ) statement list function_name sin, Sin, SIN parameter 1, parameter 2, parameter n 0 1 1 PHP HTML 3 function strcat ($left,

More information

Abstract arm linux tool-chain root NET-Start! 2

Abstract arm linux tool-chain root NET-Start! 2 Lab III - Embedding Linux 1 Abstract arm linux tool-chain root NET-Start! 2 Part 1.4 Step1. tool-chain 4 Step2. PATH 4 Part 2 kernel 5 Step1. 5 Step2... 6 Step3...8 Part 3 root. 8 Step1. 8 Step2. 8 Part

More information

CC213

CC213 : (Ken-Yi Lee), E-mail: feis.tw@gmail.com 9 [P.11] : Dev C++ [P.12] : http://c.feis.tw [P.13] [P.14] [P.15] [P.17] [P.23] Dev C++ [P.24] [P.27] [P.34] C / C++ [P.35] 10 C / C++ C C++ C C++ C++ C ( ) C++

More information

C/C++语言 - 分支结构

C/C++语言 - 分支结构 C/C++ Table of contents 1. if 2. if else 3. 4. 5. 6. continue break 7. switch 1 if if i // colddays.c: # include int main ( void ) { const int FREEZING = 0; float temperature ; int cold_ days

More information

untitled

untitled 1 Outline 數 料 數 數 列 亂數 練 數 數 數 來 數 數 來 數 料 利 料 來 數 A-Z a-z _ () 不 數 0-9 數 不 數 SCHOOL School school 數 讀 school_name schoolname 易 不 C# my name 7_eleven B&Q new C# (1) public protected private params override

More information

Simulator By SunLingxi 2003

Simulator By SunLingxi 2003 Simulator By SunLingxi sunlingxi@sina.com 2003 windows 2000 Tornado ping ping 1. Tornado Full Simulator...3 2....3 3. ping...6 4. Tornado Simulator BSP...6 5. VxWorks simpc...7 6. simulator...7 7. simulator

More information

e bug 0 x=0 y=5/x 0 Return 4 2

e bug 0 x=0 y=5/x 0 Return 4 2 e 1 4 1 4 4.1 4.2 4.3 4.4 4.5 e 2 4.1 bug 0 x=0 y=5/x 0 Return 4 2 e 3 4 3 e 4 (true) (false) 4 4 e 5 4 5 4.2 1 G= V E V={n1,n2,,n m } E={e1,e2,,e p } e k ={n i,n j }, n i,n j V e 6 4.2 4 6 1 e 3 n 1 e

More information

NOWOER.OM m/n m/=n m/n m%=n m%n m%=n m%n m/=n 4. enum string x1, x2, x3=10, x4, x5, x; 函数外部问 x 等于什么? 随机值 5. unsigned char *p1; unsigned long *p

NOWOER.OM m/n m/=n m/n m%=n m%n m%=n m%n m/=n 4. enum string x1, x2, x3=10, x4, x5, x; 函数外部问 x 等于什么? 随机值 5. unsigned char *p1; unsigned long *p NOWOER.OM /++ 程师能 评估. 单项选择题 1. 下 描述正确的是 int *p1 = new int[10]; int *p2 = new int[10](); p1 和 p2 申请的空间 的值都是随机值 p1 和 p2 申请的空间 的值都已经初始化 p1 申请的空间 的值是随机值,p2 申请的空间 的值已经初始化 p1 申请的空间 的值已经初始化,p2 申请的空间 的值是随机值 2.

More information

Fun Time (1) What happens in memory? 1 i n t i ; 2 s h o r t j ; 3 double k ; 4 char c = a ; 5 i = 3; j = 2; 6 k = i j ; H.-T. Lin (NTU CSIE) Referenc

Fun Time (1) What happens in memory? 1 i n t i ; 2 s h o r t j ; 3 double k ; 4 char c = a ; 5 i = 3; j = 2; 6 k = i j ; H.-T. Lin (NTU CSIE) Referenc References (Section 5.2) Hsuan-Tien Lin Deptartment of CSIE, NTU OOP Class, March 15-16, 2010 H.-T. Lin (NTU CSIE) References OOP 03/15-16/2010 0 / 22 Fun Time (1) What happens in memory? 1 i n t i ; 2

More information

C PICC C++ C++ C C #include<pic.h> C static volatile unsigned char 0x01; static volatile unsigned char 0x02; static volatile unsigned cha

C PICC C++ C++ C C #include<pic.h> C static volatile unsigned char 0x01; static volatile unsigned char 0x02; static volatile unsigned cha CYPOK CYPOK 1 UltraEdit Project-->Install Language Tool: Language Suite----->hi-tech picc Tool Name ---->PICC Compiler Executable ---->c:hi-picinpicc.exe ( Command-line Project-->New Project-->File Name--->myc

More information

四川省普通高等学校

四川省普通高等学校 四 川 省 普 通 高 等 学 校 计 算 机 应 用 知 识 和 能 力 等 级 考 试 考 试 大 纲 (2013 年 试 行 版 ) 四 川 省 教 育 厅 计 算 机 等 级 考 试 中 心 2013 年 1 月 目 录 一 级 考 试 大 纲 1 二 级 考 试 大 纲 6 程 序 设 计 公 共 基 础 知 识 6 BASIC 语 言 程 序 设 计 (Visual Basic) 9

More information

浙江大学本科论文模板

浙江大学本科论文模板 本 科 生 毕 业 设 计 报 告 项 目 名 称 微 型 操 作 系 统 的 设 计 与 实 现 姓 名 与 学 号 曲 国 铖 3063027053 指 导 老 师 王 新 宇 专 业 计 算 机 科 学 与 技 术 学 院 计 算 机 学 院 A Dissertation Submitted to Zhejiang University for the Degree of Bachelor of

More information

untitled

untitled Lwip Swedish Institute of Computer Science February 20, 2001 Adam Dunkels adam@sics.se (QQ: 10205001) (QQ: 329147) (QQ:3232253) (QQ:3232253) QQ ARM TCPIP LCD10988210 LWIP TCP/IP LWIP LWIP lwip API lwip

More information

untitled

untitled MODBUS 1 MODBUS...1 1...4 1.1...4 1.2...4 1.3...4 1.4... 2...5 2.1...5 2.2...5 3...6 3.1 OPENSERIAL...6 3.2 CLOSESERIAL...8 3.3 RDMULTIBIT...8 3.4 RDMULTIWORD...9 3.5 WRTONEBIT...11 3.6 WRTONEWORD...12

More information

ebook8-30

ebook8-30 3 0 C C C C C C++ C + + C++ GNU C/C++ GNU egcs UNIX shell s h e l l g a w k P e r l U N I X I / O UNIX shell awk P e r l U N I X C C C C C C U N I X 30.1 C C U N I X 70 C C U N I X U N I X U N I X C Dennis

More information

epub 33-8

epub 33-8 8 1) 2) 3) A S C I I 4 C I / O I / 8.1 8.1.1 1. ANSI C F I L E s t d i o. h typedef struct i n t _ f d ; i n t _ c l e f t ; i n t _ m o d e ; c h a r *_ n e x t ; char *_buff; /* /* /* /* /* 1 5 4 C FILE

More information

Oracle Oracle Solaris Studio IDE makefile C C++ Fortran makefile IDE Solaris Linux C/C++/Fortran Oracle IDE "P

Oracle Oracle Solaris Studio IDE makefile C C++ Fortran makefile IDE Solaris Linux C/C++/Fortran Oracle IDE P Oracle Solaris Studio 12.3 IDE 2011 12 E26461-01 2 7 8 9 9 Oracle 10 12 14 21 26 27 29 31 32 33 Oracle Solaris Studio IDE makefile C C++ Fortran makefile IDE Solaris Linux C/C++/Fortran Oracle IDE "Project

More information

( CIP) /. :, ( ) ISBN TP CIP ( 2005) : : : : * : : 174 ( A ) : : ( 023) : ( 023)

( CIP) /. :, ( ) ISBN TP CIP ( 2005) : : : : * : : 174 ( A ) : : ( 023) : ( 023) ( CIP) /. :, 2005. 2 ( ) ISBN 7-5624-3339-9.......... TP311. 1 CIP ( 2005) 011794 : : : : * : : 174 ( A ) :400030 : ( 023) 65102378 65105781 : ( 023) 65103686 65105565 : http: / /www. cqup. com. cn : fxk@cqup.

More information

Outline USB Application Requirements Variable Definition Communications Code for VB Code for Keil C Practice

Outline USB Application Requirements Variable Definition Communications Code for VB Code for Keil C Practice 路 ESW 聯 USB Chapter 9 Applications For Windows Outline USB Application Requirements Variable Definition Communications Code for VB Code for Keil C Practice USB I/O USB / USB 3 料 2 1 3 路 USB / 列 料 料 料 LED

More information

Microsoft Word - 实用案例.doc

Microsoft Word - 实用案例.doc 计 算 机 系 统 应 用 2009 年 第 12 期 嵌 入 式 Linux 下 温 湿 度 传 感 器 的 设 计 与 实 现 1 Design and Implementation of Temperature and Humidity Sensor Based on Embedded Linux 陈 博 刘 锦 高 ( 华 东 师 范 大 学 电 子 科 学 技 术 系 上 海 200241)

More information

C/C++ 语言 - 循环

C/C++ 语言 - 循环 C/C++ Table of contents 7. 1. 2. while 3. 4. 5. for 6. 8. (do while) 9. 10. (nested loop) 11. 12. 13. 1 // summing.c: # include int main ( void ) { long num ; long sum = 0L; int status ; printf

More information

untitled

untitled 3 C++ 3.1 3.2 3.3 3.4 new delete 3.5 this 3.6 3.7 3.1 3.1 class struct union struct union C class C++ C++ 3.1 3.1 #include struct STRING { typedef char *CHARPTR; // CHARPTR s; // int strlen(

More information

chp6.ppt

chp6.ppt Java 软 件 设 计 基 础 6. 异 常 处 理 编 程 时 会 遇 到 如 下 三 种 错 误 : 语 法 错 误 (syntax error) 没 有 遵 循 语 言 的 规 则, 出 现 语 法 格 式 上 的 错 误, 可 被 编 译 器 发 现 并 易 于 纠 正 ; 逻 辑 错 误 (logic error) 即 我 们 常 说 的 bug, 意 指 编 写 的 代 码 在 执 行

More information

第3章.doc

第3章.doc 3 3 3 3.1 3 IT Trend C++ Java SAP Advantech ERPCRM C++ C++ Synopsys C++ NEC C C++PHP C++Java C++Java VIA C++ 3COM C++ SPSS C++ Sybase C++LinuxUNIX Motorola C++ IBM C++Java Oracle Java HP C++ C++ Yahoo

More information

ebook15-2

ebook15-2 2 U N I X 2.1 U N I X C U N I X U N I X 80 U N I X ( ) U N I X 2.2 UNIX 2.2.1 ANSI C 1989 C A N S I X 3. 159-1989 ANSI 1989 ISO/IEC 9899:1990 A N S I ( I S O ) ANSI C C UN I X C ANSI 1989 4 Plauger 1992;Kernighan

More information

(6) 要 求 付 款 管 理 员 从 预 订 表 中 查 询 距 预 订 的 会 议 时 间 两 周 内 的 预 定, 根 据 客 户 记 录 给 满 足 条 件 的 客 户 发 送 支 付 余 款 要 求 (7) 支 付 余 款 管 理 员 收 到 客 户 余 款 支 付 的 通 知 后, 检

(6) 要 求 付 款 管 理 员 从 预 订 表 中 查 询 距 预 订 的 会 议 时 间 两 周 内 的 预 定, 根 据 客 户 记 录 给 满 足 条 件 的 客 户 发 送 支 付 余 款 要 求 (7) 支 付 余 款 管 理 员 收 到 客 户 余 款 支 付 的 通 知 后, 检 2016 年 上 半 年 软 件 设 计 师 考 试 真 题 ( 下 午 题 ) 下 午 试 题 试 题 一 ( 共 15 分 ) 阅 读 下 列 说 明 和 图, 回 答 问 题 1 至 问 题 4, 将 解 答 填 入 答 题 纸 的 对 应 栏 内 说 明 某 会 议 中 心 提 供 举 办 会 议 的 场 地 设 施 和 各 种 设 备, 供 公 司 与 各 类 组 织 机 构 租 用 场

More information

NEXT SDT2.51 C:\ARM251 SDT2.51 ARM SDT 2.51 ARM PROJECT MANAGER SDT 2

NEXT SDT2.51 C:\ARM251 SDT2.51 ARM SDT 2.51 ARM PROJECT MANAGER SDT 2 S3C44B0 SDT DRAGNBOY MICROSTAR ARM 51 ARM S3C44B0 ARM SDT2.51 IAR ADS SDT2.51 S3C44B0 LEDTEST SDT ARM 1 2 SDT embed.8800.org SDT2.51 SDT2.51 ARM ARM CPU ARM SDT ADS ADS MULTI-ICE SDT JTAG JTAG SDT SDT2.51

More information

3.1 num = 3 ch = 'C' 2

3.1 num = 3 ch = 'C' 2 Java 1 3.1 num = 3 ch = 'C' 2 final 3.1 final : final final double PI=3.1415926; 3 3.2 4 int 3.2 (long int) (int) (short int) (byte) short sum; // sum 5 3.2 Java int long num=32967359818l; C:\java\app3_2.java:6:

More information

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 4 月 19 日晚 9 点 复习 类的复用 组合 (composition): has-a 关系 class MyType { public int i; public double d; public char c; public void set(double x) { d

More information

Generated by Unregistered Batch DOC TO PDF Converter , please register! 浙江大学 C 程序设计及实验 试题卷 学年春季学期考试时间 : 2003 年 6 月 20 日上午 8:3

Generated by Unregistered Batch DOC TO PDF Converter , please register! 浙江大学 C 程序设计及实验 试题卷 学年春季学期考试时间 : 2003 年 6 月 20 日上午 8:3 浙江大学 C 程序设计及实验 试题卷 2002-2003 学年春季学期考试时间 : 2003 年 6 月 20 日上午 8:30-10:30 注意 : 答题内容必须写在答题卷上, 写在本试题卷上无效 一. 单项选择题 ( 每题 1 分, 共 10 分 ) 1. 下列运算符中, 优先级最低的是 A.

More information

1 CPU

1 CPU 2000 Tel 82316285 82317634 Mail liuxd@buaa.edu.cn 1 CPU 2 CPU 7 72 A B 85 15 3 1/2 M301 2~17 : 3/4 1/2 323 IBM PC 1. 2. 3. 1. 2. 3. 1.1 Hardware Software 1.2 M3 M2 M1 1.2 M3 M1 M2 M2 M1 M1 M1 1.2 M3 M1

More information

Microsoft PowerPoint - 4. 数组和字符串Arrays and Strings.ppt [兼容模式]

Microsoft PowerPoint - 4. 数组和字符串Arrays and Strings.ppt [兼容模式] Arrays and Strings 存储同类型的多个元素 Store multi elements of the same type 数组 (array) 存储固定数目的同类型元素 如整型数组存储的是一组整数, 字符数组存储的是一组字符 数组的大小称为数组的尺度 (dimension). 定义格式 : type arrayname[dimension]; 如声明 4 个元素的整型数组 :intarr[4];

More information

C/C++ - 数组与指针

C/C++ - 数组与指针 C/C++ Table of contents 1. 2. 3. 4. 5. 6. 7. 8. 1 float candy [ 365]; char code [12]; int states [50]; 2 int array [6] = {1, 2, 4, 6, 8, 10}; 3 // day_mon1.c: # include # define MONTHS 12 int

More information

第5章:汇编语言程序设计

第5章:汇编语言程序设计 第 5 章 : 汇编语言程序设计 程 汇编语言指令格式 系统伪指令 存储器选择方式 常用子程序 1 汇编语言程序设计 PIC 指令系统 语言系统 指 CPU 编 器语言 器语言 器语言 设计 用 语言 设计 语言 汇编语言 2 汇编语言指令格式 汇编语言指令格式 ( 指令 ) label opcode operand comment 指令 用 存 指令 指令语 3 汇编语言指令格式 1 指令 用 指令

More information

目 录

目 录 1 Quick51...1 1.1 SmartSOPC Quick51...1 1.2 Quick51...1 1.3 Quick51...2 2 Keil C51 Quick51...4 2.1 Keil C51...4 2.2 Keil C51...4 2.3 1 Keil C51...4 2.4 Flash Magic...9 2.5 ISP...9 2.6...10 2.7 Keil C51...12

More information

L15 MIPS Assembly

L15 MIPS Assembly Lecture 19: MIPS Assembly Language 程序的机器级表示主要内容 MIPS 指令格式 R- 类型 / I- 类型 / J- 类型 MIPS 寄存器 长度 / 个数 / 功能分配 MIPS 操作数 寄存器操作数 / 存储器操作数 / 立即数 / 文本 / 位 MIPS 指令寻址方式 立即数寻址 / 寄存器寻址 / 相对寻址 / 伪直接寻址 / 偏移寻址 MIPS 指令类型

More information

全国计算机技术与软件专业技术资格(水平)考试

全国计算机技术与软件专业技术资格(水平)考试 全 国 计 算 机 技 术 与 软 件 专 业 技 术 资 格 ( 水 平 ) 考 试 2008 年 上 半 年 程 序 员 下 午 试 卷 ( 考 试 时 间 14:00~16:30 共 150 分 钟 ) 试 题 一 ( 共 15 分 ) 阅 读 以 下 说 明 和 流 程 图, 填 补 流 程 图 中 的 空 缺 (1)~(9), 将 解 答 填 入 答 题 纸 的 对 应 栏 内 [ 说 明

More information

C H A P T E R 7 Windows Vista Windows Vista Windows Vista FAT16 FAT32 NTFS NTFS New Technology File System NTFS

C H A P T E R 7 Windows Vista Windows Vista Windows Vista FAT16 FAT32 NTFS NTFS New Technology File System NTFS C H P T E R 7 Windows Vista Windows Vista Windows VistaFT16 FT32NTFS NTFSNew Technology File System NTFS 247 6 7-1 Windows VistaTransactional NTFS TxFTxF Windows Vista MicrosoftTxF CIDatomicity - Consistency

More information