精品文档
习 题
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寄存器
AHA12GAGGAGAGGAFFFFAFAF
精品文档
(8)源操作数地址中缺少变址寄存器 5.参考答案:
表3.12 题5用表
src_type char int int short unsigned char char int 6.参考答案:
(1)xptr、yptr和zptr对应实参所存放的存储单元地址分别为:R[ebp]+8、R[ebp]+12、
R[ebp]+16。
(2)函数func的C语言代码如下:
AHA12GAGGAGAGGAFFFFAFAF
unsigned movsbl %al, (íx) int movl êx, (íx) dst_type int char 机器级表示 movsbl %al, (íx) movb %al, (íx) unsigned movl êx, (íx) int movswl %ax, (íx) unsigned movzbl %al, (íx) 精品文档
void func(int *xptr, int *yptr, int *zptr) {
int tempx=*xptr; int tempy=*yptr; int tempz=*zptr; *yptr=tempx;
*zptr = tempy;
*xptr = tempz; }
AHA12GAGGAGAGGAFFFFAFAF
精品文档
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
+ 1 0000 0000 0000 0000 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中内容改变。改变后的内容为以下运算的结果:
AHA12GAGGAGAGGAFFFFAFAF
精品文档
00000010H-80000008H
0000 0000 0000 0000 0000
+ 0 1000 0000 0000 0000 0000
因此,ECX中的内容改为0x80000008。根据表3.5可知,减法指令会影响OF、SF、ZF和CF标志。OF=1,ZF=0,SF=1,CF=1
0=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 1111
1111
o
因此,BX中的内容改为0xFF00。由3.3.3节可知,OR指令执行后OF=CF=0;因为结果不为0,故ZF=0;因为最高位为1,故SF=1。
(4)test指令不改变任何通用寄存器,但根据以下“与”操作改变标志:R[dl] and 0x80
1000 0000 1000 0000
an由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,即存储单
AHA12GAGGAGAGGAFFFFAFAF