三地址代码(3) 指令集合(2) 过程调用/返回 param x ∥设置参数 param x2 param x call p,n ∥调用子过程p,n为参数个数 带下标的复制指令:x=y[) x[]=y 。 注意:表示离开数组位置第个字节,而不是数组的第个元素 地址/指针赋值指令 。x=&y x=*y *x=y 11
三地址代码 (3) • 指令集合 (2) – 过程调用/返回 • param x1 // 设置参数 • param x2 • … • param xn • call p, n // 调用子过程p,n为参数个数 – 带下标的复制指令:x = y[i] x[i] = y • 注意:i表示离开数组位置第i个字节,而不是数组的第i个元素 – 地址/指针赋值指令 • x = &y x = *y *x = y 11 南大编译许畅
例子 。语句 doi=i+1;while (a[i]<v); L: t1=i+1 100: t1=1+1 i =ti 101: i=ti t2 i ⑧ 102: t2=1*8 t3 a t2 103: t3=a[t2] if t3<v goto L 104: if t3 v goto 100 a)符号标号 b)位置号 12
例子 • 语句 – do i = i + 1; while (a[i] < v); 12 南大编译许畅
三地址指令的四元式表示方法 在实现时,可使用四元式/三元式/间接三元式/静 态单赋值来表示三地址指令 。 四元式:可以实现为记录(或结构) 格式(字段): op arg arg2 result 0p:运算符的内部编码 ar81var82,result是地址 X=y+2 y Z X 单目运算符不使用ar82 param运算不使用arg2和result 条件转移/非条件转移将目标标号放在result字段 13
三地址指令的四元式表示方法 • 在实现时,可使用四元式/三元式/间接三元式/静 态单赋值来表示三地址指令 • 四元式:可以实现为记录 (或结构) – 格式 (字段) : op arg1 arg2 result – op:运算符的内部编码 – arg1 , arg2 , result是地址 – x = y + z + y z x • 单目运算符不使用arg2 • param运算不使用arg2和result • 条件转移/非条件转移将目标标号放在result字段 13 南大编译许畅
四元式的例子 赋值语句:a=b*-c+b*-c op arg arg, 、1 result t1= minus c 0 minus 七1 t2 b t1 米 )1t1t2 t3 minus c 2 minus c it3 t4 b t3 3 1bt3 t4 t5 = t2+t4 4 + t21t41 t5 a =t5 5 1t51 i a a)三地址代码 b)四元式 图6-10三地址代码及其四元式表示 14
四元式的例子 • 赋值语句:a = b * − c + b * − c 14 南大编译许畅
三元式表示 三元式(Triple) op arg1 arg2 ·使用三元式的位置来引用三元式的运算结果 0 x=ypz需要拆分为(?是编号) -? op y 三 X (?) 。 x[)=y需要拆分为两个三元式 求x[的地址,然后再赋值 优化时经常需要移动/删除/添加三元式,导致三元 式的移动 15
三元式表示 • 三元式 (Triple) : op arg1 arg2 • 使用三元式的位置来引用三元式的运算结果 • x = y op z需要拆分为 (?是编号) – ? op y z – = x (?) • x[i] = y需要拆分为两个三元式 – 求x[i]的地址,然后再赋值 • 优化时经常需要移动/删除/添加三元式,导致三元 式的移动 15 南大编译许畅