程序的机器级表示

程序的机器级表示

IA32和X86-64(AMD)

32位和64位

ISA

instruction system architecture

重要寄存器

  1. 程序计数器PC %eip
  2. 整数寄存器 8个每个32位
    有的用来记录状态,有的用来保存临时数据,局部变量,返回值
    3.条件码寄存器

字 16位,双字double word, 4字

  1. 指针都是双字
  2. char short long 其他4字节
  3. movb movw movl

32位的寄存器

%al %ah -> %ax -> %eax
%eax %ebx %ecx %edx %edi %esi %esp %ebp

存取数

Imm(Ea,Eb,s) -> M[Imm + R[Ea] + R[Eb] * s]

只有完整的寄存器可以()

只有完整的寄存器可以()

习题

3.1

操作数
%eax0x100
0x1040x104 -> 0xAB
$0x1080x108
(%eax)0xFF
4(%eax)0xAB
9(%eax,%edx)0x11
260(%ecx,%edx)->0x13
0xFC(,%ecx,4)0xFF
(%eax,%edx,4)0x11

mov操作

分为mov,movs(sign),movz(zero)
然后IA32规定不能直接存储器到存储器,中间必须经过一个寄存器。

算术与逻辑操作

1.加载有效地址 2.一元操作和二元操作 3.移位操作
1. load effective address = lea 就是取地址 第二个位置必须是寄存器
2. Inc x x可以是寄存器也可以是存储器
3. sub s,d d <- d-s d是寄存器或者存储器

特殊的操作

imull S R[%edx]:R[%eax] <- S * R[%eax] 有符号的
divl S R[%edx] <- R[%edx]:R[%eax] MOD S
R[%eax] <- R[%edx]:R[%eax] / S

3.2

movl%eax, (%esp)
movw(%eax),%dx
movb$0xFF, %bl
movb(%esp,%edx,4),%dh
pushb->pushl$0xFF 栈只能4个字节4个字节存放
movw%dx, (%eax)
popl%edi

3.3

movb $0xF, (%bl)不完整不能寄存器
movl %ax,(%esp)l是4, %ax是2
movw (%eax),4(%esp)不能都是内存地址
movb %ah,%sh没有%sh
movl %eax, $0x123不可以吧
movl %eax,%dxdx是2,l是4
movb %si,8(%ebp)b是1,%si是4

3.4

src_tdest_t指令
intintmovl %eax, (%edx)
charintmovzbl %eax, (%edx) -> ?
charunsignedmovzbl %eax, (%edx) -> ?
unsigned charintmovzbw %eax, (%edx)->movzbl %eax, (%edx)
intcharmovb %al,(%edx)
unsignedunsigned charmovb %al, (%edx)
unsignedintmovl %eax, (%edx)

3.5

void f(int *xp,int *yp,int *zp) {
int tx = *xp;
int ty = *yp;
int tz = *zp;

*yp = tx;
*zp = ty;
*xp = tz;

}

3.6

指令效果
leal 6(%eax),%edx6 + x
leal (%eax,%ecx),%edxx + y
leal (%eax,%ecx,4),%edxx + 4 * y
leal 7(%eax,%eax,8),%edx9 * x + 7
leal 0xA(,%ecx,4),%edx4 * y + 0xA
leal 9(%eax,%ecx,2),%edxx + 2 * y + 9

3.7

指令目的
addl %ecx,(%eax)0x1000x100
subl %edx,4(%eax)0x1040xA8
imull $16,(%eax,%edx,4)0x10C0x101->0x110
incl 8(%eax)0x1080x14
decl %ecx%ecx0x0
subl %edx,%eax%eax0xFD

3.8

  1. shll 2,eax
  2. sarl %cl,%eax

3.9

int t1 = y ^ x;
int t2 = (y ^ x) * 8;
int t3 = ~t3;
int t4 = ~(y^x * 8) - z

3.10

  1. 清零
  2. movl $0,%edx

3.11

movl 8(%ebp) %eax
movl 0 %edx
divl 12(%ebp)
movl %eax 4(%esp)
movl %edx (%esp)


版权声明:本文为wait_never原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。