没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论





习 题
3. 参考答案:
(1)后缀:w, 源:基址+比例变址+偏移, 目:寄存器
(2)后缀:b, 源:寄存器, 目:基址+偏移
(3)后缀:l, 源:比例变址, 目:寄存器
(4)后缀:b, 源:基址, 目:寄存器
(5)后缀:l, 源:立即数, 目:栈
(6)后缀:l, 源:立即数, 目:寄存器
(7)后缀:w, 源:寄存器, 目:寄存器
(8)后缀:l, 源:基址+变址+偏移, 目:寄存器
4.参考答案:
(1)源操作数是立即数 0xFF,需在前面加‘$’
(2)源操作数是 16 位,而长度后缀是字节‘b’,不一致
(3)目的操作数不能是立即数寻址
(4)操作数位数超过 16 位,而长度后缀为 16 位的‘w’
(5)不能用 8 位寄存器作为目的操作数地址所在寄存器
(6)源操作数寄存器与目操作数寄存器长度不一致
(7)不存在 ESX 寄存器
(8)源操作数地址中缺少变址寄存器
5.参考答案:
表 3.12 题 5 用表
src_type
char
int
int
short
unsigned char
char
int
dst_type
int
char
unsigned
int
unsigned
unsigned
int
机器级表示
movsbl %al, (%edx)
movb %al, (%edx)
movl %eax, (%edx)
movswl %ax, (%edx)
movzbl %al, (%edx)
movsbl %al, (%edx)
movl %eax, (%edx)
6.参考答案:
(1)xptr、yptr 和 zptr 对应实参所存放的存储单元地址分别为:R[ebp]+8、R[ebp]+12、
R[ebp]+16。
(2)函数 func 的 C 语言代码如下:
void func(int *xptr, int *yptr, int *zptr)
{
int tempx=*xptr;
int tempy=*yptr;
int tempz=*zptr;
*yptr=tempx;
*zptr = tempy;
*xptr = tempz;
}

7.参考答案:
(1)R[edx]=x
(2)R[edx]=x+y+4
(3)R[edx]=x+8*y
(4)R[edx]=y+2*x+12
(5)R[edx]=4*y
(6)R[edx]=x+y
8.参考答案:
(1)指令功能为:R[edx]←R[edx]+M[R[eax]]=0x00000080+M[0x8049300],寄存器 EDX 中内容改变。改变后的
内容为以下运算的结果:00000080H+FFFFFFF0H
0000 0000 0000 0000 0000 0000 1000 0000
+ 1111 1111 1111 1111 1111 1111 1111 0000
1 0000 0000 0000 0000 0000 0000 0111 0000
因此,EDX 中的内容改变为 0x00000070。根据表 3.5 可知,加法指令会影响 OF、SF、ZF 和 CF 标志。OF=0,
ZF=0,SF=0,CF=1。
(2)指令功能为:R[ecx]←R[ecx]-M[R[eax]+R[ebx]]=0x00000010+M[0x8049400], 寄存器 ECX 中内容改变。
改变后的内容为以下运算的结果:00000010H-80000008H
0000 0000 0000 0000 0000 0000 0001 0000
+
0111 1111 1111 1111 1111 1111 1111 1000
0 1000 0000 0000 0000 0000 0000 0000 1000
因此,ECX 中的内容改为 0x80000008。根据表 3.5 可知,减法指令会影响 OF、SF、ZF 和 CF 标志。OF=1,
ZF=0,SF=1,CF=10=1。
(3)指令功能为:R[bx]←R[bx] or M[R[eax]+R[ecx]*8+4],寄存器 BX 中内容改变。改变后的内容为以下运算
的结果:0x0100 or M[0x8049384]=0100H or FF00H
0000 0001 0000 0000
or
1111 1111 0000 0000
1111 1111 0000 0000
因此,BX 中的内容改为 0xFF00。由 3.3.3 节可知,OR 指令执行后 OF=CF=0;因为结果不为 0,故 ZF=0;
因为最高位为 1,故 SF=1。
(4)test 指令不改变任何通用寄存器,但根据以下“与”操作改变标志:R[dl] and 0x80
1000 0000
and
1000 0000
1000 0000
由 3.3.3 节可知,TEST 指令执行后 OF=CF=0;因为结果不为 0,故 ZF=0;因为最高位为 1,故 SF=1。
(5)指令功能为:M[R[eax]+R[edx]]←M[R[eax]+R[edx]]*32,即存储单元 0x8049380 中的内容改变为以下运算
的结果:M[0x8049380]*32=0x908f12a8*32,也即只要将 0x908f12a8 左移 5 位即可得到结果。
1001 0000 1000 1111 0001 0010 1010 1000<<5
=0001 0001 1110 0010 0101 0101 0000 0000
因此,指令执行后,单元 0x8049380 中的内容改变为 0x11e25500。显然,这个结果是溢出的。但是,根据
表 3.5 可知,乘法指令不影响标志位,也即并不会使 OF=1。

(6)指令功能为:R[cx] ←R[cx]-1,即 CX 寄存器的内容减一。
0000 0000 0001 0000
+
1111 1111 1111 1111
1 0000 0000 0000 1111
因此,指令执行后 CX 中的内容从 0x0010 变为 0x000F。由表 3.5 可知,DEC 指令会影响 OF、ZF、SF,
根据上述运算结果,得到 OF=0,ZF=0,SF=0。
9.参考答案:
movl 12(%ebp), %ecx //R[ecx]←M[R[ebp]+12],将 y 送 ECX
sall $8, %ecx //R[ecx]←R[ecx]<<8,将 y*256 送 ECX
movl 8(%ebp), %eax //R[eax]←M[R[ebp]+8],将 x 送 EAX
movl 20(%ebp), %edx //R[edx]←M[R[ebp]+20],将 k 送 EDX
imull %edx, %eax //R[eax]←R[eax]*R[edx],将 x*k 送 EAX
movl 16(%ebp), %edx //R[edx]←M[R[ebp]+16],将 z 送 EDX
andl $65520, %edx //R[edx]←R[edx] and 65520,将 z&0xFFF0 送 EDX
addl %ecx, %edx //R[edx]←R[edx] + R[ecx],将 z&0xFFF0+y*256 送 EDX
subl %edx, %eax //R[eax]←R[eax]-R[edx],将 x*k-(z&0xFFF0+y*256)送 EAX
根据以上分析可知,第 3 行缺失部分为:
3 int v = x*k-(z&0xFFF0+y*256) ;
10.参考答案:
从汇编代码的第 2 行和第 4 行看,y 应该是占 8 个字节,R[ebp]+20 开始的 4 个字节为高 32 位字节,记为 y
h
;
R[ebp]+16 开始的 4 个字节为低 32 位字节,记为 y
l
。根据第 4 行为无符号数乘法指令,得知 y 的数据类型 num_type
为 unsigned long long。
movl 12(%ebp), %eax //R[eax]←M[R[ebp]+12],将 x 送 EAX
movl 20(%ebp), %ecx //R[ecx]←M[R[ebp]+20],将 y
h
送 ECX
imull %eax, %ecx //R[ecx]←R[ecx]*R[eax],将 y
h
*x 的低 32 位送 ECX
mull 16(%ebp) //R[edx]R[eax]←M[R[ebp]+16]*R[eax],将 y
l
*x 送 EDX-EAX
(%ecx, %edx), %edx
// R[edx]←R[ecx]+R[edx],将 y
l
*x 的高 32 位与 y
h
*x 的低 32 位相加后送 EDX
movl 8(%ebp), %ecx //R[ecx]←M[R[ebp]+8],将 d 送 ECX
movl %eax, (%ecx) //M[R[ecx]]←R[eax],将 x*y 低 32 位送 d 指向的低 32 位
movl %edx, 4(%ecx) //M[R[ecx]+4]←R[edx],将 x*y 高 32 位送 d 指向的高 32 位
11.参考答案:
根据第 3.3.4 节得知,条件转移指令都采用相对转移方式在段内直接转移,即条件转移指令的转移目标地址为:
(PC)+偏移量。
(1)因为 je 指令的操作码为 01110100,所以机器代码 7408H 中的 08H 是偏移量,故转移目标地址为:
0x804838c+2+0x8=0x8048396。
call 指令中的转移目标地址 0x80483b1=0x804838e+5+0x1e,由此,可以看出,call 指令机器代码中后面的 4 个
字节是偏移量,因 IA-32 采用小端方式,故偏移量为 0000001EH。call 指令机器代码共占 5 个字节,因此,下条指令
的地址为当前指令地址 0x804838e 加 5。
(2)jb 指令中 F6H 是偏移量,故其转移目标地址为:0x8048390+2+0xf6=0x8048488。
movl 指令的机器代码有 10 个字节,前两个字节是操作码等,后面 8 个字节为两个立即数,因为是小端方式,
所以,第一个立即数为 0804A800H,即汇编指令中的目的地址 0x804a800,最后 4 个字节为立即数 00000001H,即
汇编指令中的常数 0x1。
leal
剩余10页未读,继续阅读
资源评论

凰焰雨
- 粉丝: 0
- 资源: 1

上传资源 快速赚钱
我的内容管理 收起
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助

会员权益专享
安全验证
文档复制为VIP权益,开通VIP直接复制
