Microsoft PowerPoint - lec11 [兼容模式]

Similar documents
Static Enforcement of Security with Types

Microsoft PowerPoint - 05-第五讲-寻址方式.pptx

gcc 对整型和浮点型参数传递的汇编码生成特点分析 张昱 1. 相关资料 关于浮点数 (Floating-point) 的存储表示 : 浮点数的存储目前广泛采用 IEEE 754 标准 (1980 年 Intel 提出, 1985 年被 IEEE 采纳,

乌鲁木齐城市交通改善项目Ⅱ

<4D F736F F D20B5DAC8FDCBC4D5C2D7F7D2B5B4F0B0B82E646F63>

学习MSP430单片机推荐参考书

大侠素材铺

最新执法工作手册(九十八)

编译原理与技术

untitled

Microsoft Word - 第三章第一節第二節.doc

untitled

3 程序的机器级表示 2017 年 3 月 11 日 11: 计算机执行机器代码, 用字节序列编码低级的操作, 包括处理数据 管理存储器 读写存储在设备上的数据, 以及利用网络通信 通常情况下, 现代的优化编译器产生的代码至少与一个熟练的汇编语言程序员手工编写的代码一样有

1 CPU interrupt INT trap CPU exception

资 产 种 类 市 值 ( 元 ) 占 净 资 产 银 行 活 期 存 款 8,220, 中 央 银 行 票 据 一 年 期 以 内 ( 含 一 年 ) 定 期 存 款 / 协 议 存 款 流 动 性 买 入 返 售 金 融 资 产 0.

Microsoft Word - AT&T2_bold.doc

目 录.doc

幻灯片 1

ROP_bamboofox.key

Linux kernel exploit研究和探索

今天刚发现的, 比较简单, 于是就来简单分析下吧 该感染样本很简单, 新加了个区段放病毒执行代码, 执行病毒代码, 最后跳回原入口点来执行原文件 下面就是感染后的代码的简单分析 : ; =============== S U B R O U T I N E =====================

書本介紹


漏 洞 攻 防 EXPLOIT ATTACK & DEFENCE 栏 目 编 辑 脚 本 小 子 scriptsboy@hacker.com.cn HEAD 部 分 大 小 当 然 也 就 是 固 定 的 18200H 如 果 要 提 取 出 HEAD, 我 们 可 以 选 中 前 18200H 字

01

untitled


为 了 衡 量 一 个 算 法 时 间 效 率 上 的 优 劣, 计 算 机 科 学 中 引 入 了 时 间 复 杂 度 的 概 念 回 忆 我 们 习 惯 使 用 的 大 O 表 示 法, 我 们 说 一 个 算 法 运 行 时 间 的 界 是 O(f(n)), 所 表 示 的 意 义 是, 假

OptiROP:

CC213

untitled

<4D F736F F D20D1A7C9FACAD6B2E1B8C4D7EED6D5A3A8B4F8B1EDB8F1BCD3D2B3C2EBB0E6A3A9372E3239>

桂林市劳动和社会保障局关于

第三章 維修及管理

Microsoft Word 年度选拔硕博连读研究生的通知.doc

《西游记》(一)


银河银联系列证券投资基金

主要内容 指令系统的一般概念 指令操作方式操作码的含义指令对操作数的要求指令执行的结果 寻址方式 指令说明 2015 年 3 月 16 日星期一 8 时 2 分 37 秒 2

<4D F736F F D204C696E757820BBE3B1E0D3EFD1D4BFAAB7A2D6B8C4CF2E646F63>

净 利 润 和 扣 除 非 经 常 性 损 益 后 归 属 于 母 公 司 股 东 的 净 利 润 分 别 为 亿 元 和 亿 元 ; 3 假 设 本 公 司 2016 年 扣 除 非 经 常 性 损 益 前 归 属 于 母 公 司 股 东 的 净 利 润 分 别 为 6

游戏攻略大全(五十六).doc

牧 者 心 聲 要 因 心 懷 平 而 作 惡 要 謹 慎 言 行 免 得 舌 頭 犯 罪 ; 惡 人 時 候 要 用 嚼 環 勒 住 口 ( 詩 三 十 九 1) 今 天 社 會 和 教 會 裏 極 其 渴 望 人 能 以 具 體 行 動 勉 勵 走 善 良 正 直 路 作 好 榜 樣 ; 可 惜

2. 过程 这里主要使用 gdb 来拆炸弹 当然, 用其他工具来辅助, 应该可以更高效地完成 (gdb) echo ======================= Defuse Phase_1 ==============================\n\n ==================

中 三 中 國 語 文 科 表 6.21b 中 三 各 學 習 範 疇 的 卷 別 編 排 學 習 範 疇 分 卷 題 數 評 估 時 限 閱 讀 聆 聽 寫 作 9CR1 22 9CR2 22 9CR3 22 9CL1 16 9CL2 16 9CW1 2 9CW2 2 9CW 分 鐘

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

修改图 7.5 中计算声明名字的类型和相对地址的翻译方案, 允许名字表而不是单个名字出现在形式为 D id : T 的声明中 即允许 a, b, c : integer 这种形式的变量声明 下面是一个 C 语言程序 : long f1( i

,000

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

陕 西 地 区 普 通 高 校 本 科 学 位 论 文 检 测 研 讨 会 在 我 校 举 行 我 校 完 成 中 央 财 政 支 持 地 方 高 校 发 展 专 项 资 金 项 目 申 报 工 作 学 校 召 开 贯 彻 落 实 教 育 部 提 高 高 等 教 育 质 量 三 十 条 会 议 校

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

数据库系统概论

ARM中C和汇编混合编程及示例.doc

Microsoft Word _2005_n.doc

第4章 80X86指令系统

大侠素材铺

71 亡 環 境 鴛 應 該 叫 叫 叫 ' 般 稱 或 仔 指 它 且 叫 少 ; 淡 冬 于 冬 海 淡 誤 它 感 潮 鹹 淡 感 潮 漲 潮 貨 運 汐 止 峽 等 岸 算 海 延 伸 並 l l.-a' 108 字 義 航 運 稱 江 接 著 才 谷 此 格 講 並 和 俗 稱 雷 仔 '

没有幻灯片标题

Microsoft Word - Wuxi-RAP-Chinese.doc

一學就會,空間醫學實修大全

<4D F736F F D20BDA8C9E8CFEEC4BFBBB7BEB3D3B0CFECB1A8B8E6B1ED>

BP % 67.5% 17.8% 5.1% % 5.1% 1.5% 0.9% 17.8% 67.5% BP 2 BP28.5 1=

Microsoft PowerPoint - 微原-第3章2.ppt [兼容模式]


CH559指令周期.doc

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


.size main,.lfe1-main.local b.comm b,4,4.comm c,4,4.ident "GCC: (GNU) egcs /Linux (egcs release)" 修改图 6.5 中计算声明名字

中華臺北不符合措施清單(附件 8B:I)

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

<4D F736F F D20B5DAB6FED5C2A3AE BBE3B1E0D3EFD1D4D3EB474343C4DAC7B6BBE3B1E02E646F63>

(1)(2)(3)

99710b45zw.PDF

不 是 想 了 想 又 说, 身 体 有 点 不 舒 服, 过 来 看 看 哦, 怎 么 了? 许 是 出 于 职 业 习 惯, 谭 清 辰 脱 口 而 出 你 是 外 科 大 夫 吧? 妇 科 的 毛 病 你 也 能 治? 田 惜 菁 明 显 不 愿 意 继 续 这 个 话 题, 说 话 语 气

cgn

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

工业和信息化部 水利部 全国节约用水办公室

MSP430ϵÁе¥Æ¬»úµÄÖ¸Áîϵͳ.pps [¼æÈÝģʽ]


本次习题课中提到的 课本, 均指机械工业出版社的 Intel 微处理器 ( 原书第八版 ) 中文版, 使用其他版本课本的同学需要自己对应

南華大學數位論文

µÚ¶þÕ µ¥´¦ÀíÆ÷Ìåϵ½á¹¹

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

instructions.PDF

中国行业季度分析报告

Microsoft Word - Ch6b_P6 Chinese_2011C.doc

哈尔滨理工大学桂林工学院

首都经济贸易大学(三).DOC

PowerPoint Presentation

教科書:系統程式 - 第 2 章、電腦的硬體結構

c pm

Create By PageManager

L15 MIPS Assembly


第 壹 部 分 : 單 選 題 ( 佔 76 分 ) 說 明 : 共 有 38 題 ; 請 選 出 一 個 最 適 當 的 選 項, 標 示 在 答 案 卡 之 選 擇 題 答 案 區 每 題 答 對 得 2 分, 答 錯 或 劃 記 多 於 一 個 選 項 者 倒 扣 2/3 分, 倒 扣 到 本

Microsoft Word - 2CA13內文.doc

5 3,332,809 4,308,085 (2,617,435) (2,809,316) 715,374 1,498, ,562 98,668 (405,946) (506,551) (452,494) (434,780) 5 (153,768) (29,308) 185,354

新时期共青团工作实务全书(一百七十二)

chap07.key

<4D F736F F D20C7B0CBC4D5C2D7F7D2B5CCE22E646F6378>

Transcription:

代码生成

代码生成 代码生成的输入 - 各种中间代码形式 目标代码与目标机器模型 简单的代码生成器 基本块 DAG 图及代码生成

目标代码 绝对地址目标代码 可重定位的目标 - linker/loader 汇编代码 - assembler

目标机器模型 指令形式 op 源, 目的 寻址模式 - 绝对地址 :op M, R R op (M) R - 寄存器 :op R1,R2 R2 op R1 R2 - 变址 :op R1,c(R2) (c+r2) op R1 (c+r2) - 间接变址 间接寄存器 - 直接量 op $C, R R + C R

简单代码生成器 寄存器描述记录寄存器的使用情况, 即某寄存器中存放的是哪 ( 些 ) 个名字 ( 变量 ) 的值 名字地址描述名字 ( 变量 ) 的当前值的存放场所, 如放在寄存器或主存 ( 数据区 ) 或者栈里等

简单代码生成器 ( 续 ) 代码生成算法 对基本块中三地址代码,p: x := y op z, 1) 调用函数 getreg( ), 返回存放计算结果的场所 L( 一般为寄存器 R, 也可能是存储单元 ); 2) 若 y 的值不在 L 中, 产生指令 :mov y, L ( 查 y 的名字地址描述获得 y 值的存放场所 y ); 3) 产生指令 :op z,l ( z 是 z 值的存放场所 ), 修改 x 的名字描述和相关寄存器描述 ; 4) 若 y 和 / 或 z 在 p 之后不再引用 出口不活跃且其值在寄存器中, 则修改其相应寄存器和名字地址描述 ; 5) 在块出口处, 将所有活跃名字值刷新到相应存储单元

简单代码生成器 ( 续 ) - 函数 getreg(p:x := y op z): 返回计算结果存放场所 L, 1) 若某寄存器 R 仅含 y 的值且 p 后不再引用和不活跃, 则返回 R;( 好处是可以省掉装载 y 值的指令 mov y,l) 2) 返回某个空闲寄存器 R; 3) 若 x 必须使用寄存器, 则此时 抢占 某个寄存器 R 查看 R 的描述, 如果名字 a 的值在 R 中则产生转储指令 mov R,Ma (Ma:a 的存储单元 ), 并修改相应的描述 ;( 关键是如何抢占及剥夺哪些名字的寄存器使用权 ) 4) 使用 x 的存储单元

e.g.1 简单代码生成 三地址码序列 : t := a b u := a + c v := t + u w:= v + u 可用寄存器 R0,R1 初始, 名字 a b 和 c 的值均在相应存储单元中

e.g.1 简单代码生成 TAC 目标代码 REG NAME t:=a-b mov a, R0 sub b, R0 R0 含 t t 在 R0 u:=a+c mov a, R1 R0 含 t t 在 R0 add c, R1 R1 含 u u 在 R1 v:=t+u add R1, R0 R0 含 v v 在 R0 R1 含 u u 在 R1 w:=v+u add R1, R0 R0 含 w w 在 R0

其它语句的代码生成语句 i 在 R i i 在 M i i 在栈中 a := b[i] mov b(r i ),R mov M i,r mov S i (bp),r mov b(r),r mov b(r),r a[i] := b mov b,a(r i ) mov M i,r mov S i (bp),r mov b,a(r) mov b,a(r) S i 是 i 在栈中偏移,bp 是当前活动记录基址 指针操作语句 :a := * b *a := b

转移语句 goto X JMP X if x op y goto z - 根据寄存器内容是否满足以下条件 : 负 零 正 非负 非零 非正如 if x < y goto z : y x R 判别 R 非负 ( 实施转移 ) - 根据条件码转移如 if x < y goto z : cmp x, y jg z // 若 y > x 则转 z

AT&T 汇编简介

语法 INSTR Source, Dest e.g. movl (%ecx), %eax addl $1, %edx

前缀与后缀 % -- 寄存器前缀, 如 %eax, %ebp $ -- 立即数前缀, 如, $100( 十进制 ), $0x99( 十六进制 ) 后缀 l, w, b -- 操作数大小, 对应 long, word 和 byte, 如, movl %ebx, %ecx movb %bl, %al

内存寻址方式 section : disp ( base, index, scale ) 计算方式如下 : base + index * scale + disp section/disp/index/scale( 包括 base) 均可缺省 section 用于实模式下 如, addl (%ebx,%ecx,0x2), %edx (%ebx+%ecx*0x2)+%edx %edx subl 0x20( %eax,%ecx,0x4), %ebx %ebx - (%eax+%ecx*0x4+0x20) %ebx

内存寻址方式 leal (%ebx, %ecx), %eax %ebx + %ecx %eax 这里 scale 缺省为 1 scale 和 disp 中的立即数不加前缀 $

常用汇编指令 addl, subl, movl, sall pushl, popl, leave, ret leal, nop, incl jmp, jle 等条件转移指令

C 语句 i = i * 10 对应汇编码 movl -4(%ebp),%edx // 取变量 i 的值到寄存器 %edx movl %edx,%eax sall $2,%eax // 左移寄存器 %eax 2 位, %eax == 4 * i addl %edx,%eax // %eax == 5 * i leal 0(,%eax,2),%edx // %eax * 2 %edx, %edx == 10 * i // 为何不用 sall $1, %eax movl %edx,-4(%ebp) // 10 * i i

e.g. 2 ++ 问题 main() { long i; i = 0; //printf("%ld\n", (i=i+1)+(i=i+1)+(i=i+1)); case 1 //printf("%ld\n", (++i)+(++i)+(++i)); case 2 //printf("%ld\n", (i++)+(i++)+(i++)); case 3 return 0; }

case 1 case 2 case 3 movl $0,-4(%ebp) movl -4(%ebp),%edx incl %edx movl %edx,%eax movl %eax,-4(%ebp) movl -4(%ebp),%edx incl %edx movl %edx,%ecx movl %ecx,-4(%ebp) addl %ecx,%eax movl -4(%ebp),%edx incl %edx movl %edx,%ecx movl %ecx,-4(%ebp) addl %ecx,%eax pushl %eax pushl $.LC0 call printf movl $0,-4(%ebp) incl -4(%ebp) incl -4(%ebp) movl -4(%ebp),%eax movl -4(%ebp),%edx addl %edx,%eax incl -4(%ebp) addl -4(%ebp),%eax pushl %eax pushl $.LC0 call printf movl $0,-4(%ebp) movl -4(%ebp),%eax movl -4(%ebp),%edx addl %edx,%eax movl %eax,%edx addl -4(%ebp),%edx pushl %edx incl -4(%ebp) incl -4(%ebp) incl -4(%ebp) pushl $.LC0 call printf

基本块的 DAG 图示 基本块内优化变换 合并已知量 删除冗余运算 - 公共子表达式 删除死代码

基本块 DAG 构造 ( 不考虑别名 数组或指针 ) 对于每条语句 :x := y op z (1) 分别寻找代表 y 或 z 的当前值的结点, 若没有的话, 构造它们的初始结点 ; (2) 利用已有的算符 op 的结点或新建一个 op 结点 ( 左 右子树分别标记为 y 和 z), 将 x 标记在旁边 ; (3) 如果 x 在其他结点边上有标记 (x 0 -x 的初始值除外 ), 则去除这个标记 ; (4)x := y, 不必建立新结点而将 x 标记在 y 对应的结点旁

基本块 DAG 构造 (1) t1 := 4 * i (2) t2 := a [ t1 ] (3) t3 := 4 * i (4) t4 := b [ t3 ] (5) t5 := t2 * t4 (6) t6 := prod + t5 (7) prod := t6 (8) t7 := i + 1 (9) i := t7 (10) if i <= 20 goto (1) * t1 4 i 0

基本块 DAG 构造 (1) t1 := 4 * i (2) t2 := a [ t1 ] (3) t3 := 4 * i (4) t4 := b [ t3 ] (5) t5 := t2 * t4 (6) t6 := prod + t5 (7) prod := t6 (8) t7 := I + 1 (9) i := t7 =[] t2 * t1 (10) if i <= 20 goto (1) a 4 i 0

基本块 DAG 构造 (1) t1 := 4 * i (2) t2 := a [ t1 ] (3) t3 := 4 * i (4) t4 := b [ t3 ] (5) t5 := t2 * t4 (6) t6 := prod + t5 (7) prod := t6 (8) t7 := i + 1 (9) i := t7 =[] t2 * t1,t3 (10) if i <= 20 goto (1) a 4 i 0

基本块 DAG 构造 (1) t1 := 4 * i (2) t2 := a [ t1 ] (3) t3 := 4 * i (4) t4 := b [ t3 ] (5) t5 := t2 * t4 (6) t6 := prod + t5 (7) prod := t6 (8) t7 := i + 1 (9) i := t7 =[] t4 =[] t2 * t1,t3 (10) if i <= 20 goto (1) a b 4 i 0

基本块 DAG 构造 (1) t1 := 4 * i (2) t2 := a [ t1 ] (3) t3 := 4 * i (4) t4 := b [ t3 ] (5) t5 := t2 * t4 (6) t6 := prod + t5 (7) prod := t6 (8) t7 := i + 1 (9) i := t7 * t5 =[] t4 =[] t2 * t1,t3 (10) if i <= 20 goto (1) a b 4 i 0

基本块 DAG 构造 (1) t1 := 4 * i (2) t2 := a [ t1 ] (3) t3 := 4 * i (4) t4 := b [ t3 ] (5) t5 := t2 * t4 (6) t6 := prod + t5 (7) prod := t6 (8) t7 := i + 1 (9) i := t7 + t6 prod 0 * t5 =[] t4 =[] t2 * t1,t3 (10) if i <= 20 goto (1) a b 4 i 0

基本块 DAG 构造 (1) t1 := 4 * i (2) t2 := a [ t1 ] (3) t3 := 4 * i (4) t4 := b [ t3 ] (5) t5 := t2 * t4 (6) t6 := prod + t5 (7) prod := t6 (8) t7 := i + 1 (9) i := t7 + t6,prod prod 0 * t5 =[] t4 =[] t2 * t1,t3 (10) if i <= 20 goto (1) a b 4 i 0

基本块 DAG 构造 (1) t1 := 4 * i (2) t2 := a [ t1 ] (3) t3 := 4 * i (4) t4 := b [ t3 ] (5) t5 := t2 * t4 (6) t6 := prod + t5 (7) prod := t6 (8) t7 := i + 1 (9) i := t7 + t6,prod prod 0 * t5 =[] t4 =[] t2 * t1,t3 (10) if i <= 20 goto (1) a b 4 i 0 + t7 1

基本块 DAG 构造 (1) t1 := 4 * i (2) t2 := a [ t1 ] (3) t3 := 4 * i (4) t4 := b [ t3 ] (5) t5 := t2 * t4 (6) t6 := prod + t5 (7) prod := t6 (8) t7 := i + 1 (9) i := t7 + t6,prod prod 0 * t5 =[] t4 =[] t2 * t1,t3 (10) if i <= 20 goto (1) a b 4 i 0 + t7,i 1

基本块 DAG 构造 (1) t1 := 4 * i (2) t2 := a [ t1 ] (3) t3 := 4 * i (4) t4 := b [ t3 ] (5) t5 := t2 * t4 (6) t6 := prod + t5 (7) prod := t6 (8) t7 := i + 1 (9) i := t7 + t6,prod prod 0 * t5 =[] t4 =[] t2 * t1,t3 (10) if i <= 20 goto (1) a b 4 i 0 <= (1) + t7,i 20 1

基本块 DAG 构造 (1) t1 := 4 * i (2) t2 := a [ t1 ] (3) t3 := 4 * i (4) t4 := b [ t3 ] (5) t5 := t2 * t4 (6) t6 := prod + t5 (7) prod := t6 (8) t7 := i + 1 (9) i := t7 (10) if i <= 20 goto (1) DAG 优化后 (1) t1 := 4 * i (2) t2 := a [ t1 ] (3) t4 := b [ t1 ] (4) t5 := t2 * t4 (5) prod := prod + t5 (6) i := i + 1 (7) if i <= 20 goto (1)

基本块 DAG 构造 特殊情况下 ( 副作用 ) 注销节点 -- 数组元素指针访问过程调用多变量共享存贮

基本块 DAG 构造 x := a[ i ] a[ j ] := y z := a[ i ] DAG 优化后 x := a[ i ] z := x a[ j ]:= y 但如果在 i=j 且 a[i] y 时, 变换前后语义不等价 解决方案 : 在构造 a[ i ] 或 a[ j ] 时, 注销所有 []= 或 =[] 节点, 即不利用已有节点 ( 做为公共子表达式 ), 而构造一个新的节点

由 DAG 生成代码 DAG 中节点重新排序 ( 计算次序 )- 启发式排序算法 树最优代码生成 ( 略 )

DAG 启发式排序算法 while 还有未列出的内部节点 do { 选一个没有列出的内部节点 n, 其所有父节点均已列出 ; 列出 n; while n 的最左子节点 m 的所有父节点均已列出而且 m 不是叶子节点 do { 列出 m; n := m; } } 列出节点次序的逆序即为节点的最终计算次序

e.g. DAG 节点排序 * 1 + 2-3 - 5 * 4 + 8 + 6 c 7 d 11 e 12 a 9 b 10 计算次序 :8 6 5 4 3 2 1