最新第二章习题ddgWord下载.docx
《最新第二章习题ddgWord下载.docx》由会员分享,可在线阅读,更多相关《最新第二章习题ddgWord下载.docx(13页珍藏版)》请在冰豆网上搜索。
8080108BH。
不同指令对寄存器进行不同的操作,因而不同指令执行时寄存器内容对应的真值不同。
假定执行下列运算指令时,操作数为寄存器R1和R2的内容,则R1和R2中操作数的真值分别为多少?
(1)无符号整数加法指令
(2)带符号整数乘法指令
(3)单精度浮点数减法指令
8.假定机器M的字长为32位,用补码表示带符号整数。
表2.12中第一列给出了在机器M上执行的C语言程序中的关系表达式,请参照已有的表栏内容完成表中后三栏内容的填写。
表2.12题8用表
关系表达式
运算类型
结果
说明
0==0U
–1<
0
0U
2147483647>
–2147483647–1
2147483647U>
(int)2147483648U
–1>
–2
(unsigned)–1>
无符号整数
有符号整数
1
11…1B(232–1)>
00…0B(0)
011…1B(231–1)>
100…0B(–231)
9.在32位计算机中运行一个C语言程序,在该程序中出现了以下变量的初值,请写出它们对应的机器数(用十六进制表示)。
(1)intx=-32768
(2)shorty=522(3)unsignedz=65530
(4)charc=’@’(5)floata=-1.1(6)doubleb=10.5
10.在32位计算机中运行一个C语言程序,在该程序中出现了一些变量,已知这些变量在某一时刻的机器数(用十六进制表示)如下,请写出它们对应的真值。
(1)intx:
FFFF0006H
(2)shorty:
DFFCH(3)unsignedz:
FFFFFFFAH
(4)charc:
2AH5)floata:
C4480000H(6)doubleb:
C024800000000000H
11.以下给出的是一些字符串变量在内存中存放的字符串机器码,请根据ASCII码定义写出对应的字符串。
指出代码0AH和00H对应的字符的含义。
(1)char*mystring1:
68H65H6CH6CH6FH2CH77H6FH72H6CH64H0AH00H
(2)char*mystring2:
77H65H20H61H72H65H20H68H61H70H70H79H21H00H
12.以下给出的是一些字符串变量的初值,请写出对应的机器码。
(1)char*mystring1="
./myfile"
(2)char*mystring2="
OK,good!
"
13.已知C语言中的按位异或运算(“XOR”)用符号“^”表示。
对于任意一个位序列a,a^a=0,C语言程序可以利用这个特性来实现两个数值交换的功能。
以下是一个实现该功能的C语言函数:
1voidxor_swap(int*x,int*y)
2{
3*y=*x^*y;
/*第一步*/
4*x=*x^*y;
/*第二步*/
5*y=*x^*y;
/*第三步*/
6}
假定执行该函数时*x和*y的初始值分别为a和b,即*x=a且*y=b,请给出每一步执行结束后,x和y各自指向的内存单元中的内容分别是什么?
14.假定某个实现数组元素倒置的函数reverse_array调用了第13题中给出的xor_swap函数:
1voidreverse_array(inta[],intlen)
3intleft,right=len-1;
4for(left=0;
left<
=right;
left++,right--)
5xor_swap(&
a[left],&
a[right]);
当len为偶数时,reverse_array函数的执行没有问题。
但是,当len为奇数时,函数的执行结果不正确。
请问,当len为奇数时会出现什么问题?
最后一次循环中的left和right各取什么值?
最后一次循环中调用xor_swap函数后的返回值是什么?
对reverse_array函数作怎样的改动就可消除该问题?
15.假设以下表2.13中的x和y是某C语言程序中的char型变量,请根据C语言中的按位运算和逻辑运算的定义,填写表2.13,要求用十六进制形式填写。
表2.13题15用表
x
y
x^y
x&
x|y
~x|~y
!
&
x||y
x||!
~y
0x5F
0xA0
0xC7
0xF0
0x80
0x7F
0x07
0x55
16.对于一个n(n≥8)位的变量x,请根据C语言中按位运算的定义,写出满足下列要求的C语言表达式。
(1)x的最高有效字节不变,其余各位全变为0。
(2)x的最低有效字节不变,其余各位全变为0。
(3)x的最低有效字节全变为0,其余各位取反。
(4)x的最低有效字节全变1,其余各位不变。
17.以下是一个由反汇编器生成的一段针对某个小端方式处理器的机器级代码表示文本,其中,最左边是指令所在的存储单元地址,冒号后面是指令的机器码,最右边是指令的汇编语言表示,即汇编指令。
已知反汇编输出中的机器数都采用补码表示,请给出指令代码中划线部分表示的机器数对应的真值。
80483d2:
81ecb8010000sub&
0x1b8,%esp
80483d8:
8b5508mov0x8(%ebp),%edx
80483db:
83c214add$0x14,%edx
80483de:
8b8558feffffmov0xfffffe58(%ebp),%eax
80483e4:
0302add(%edx),%eax
80483e6:
898574feffffmov%eax,0xfffffe74(%ebp)
80483ec:
8b5508mov0x8(%ebp),%edx
80483ef:
83c244add$0x44,%edx
80483f2:
8b85c8feffffmov0xfffffec8(%ebp),%eax
80483f8:
8902mov%eax,(%edx)
80483fa:
8b4510mov0x10(%ebp),%eax
80483fd:
03450cadd0xc(%ebp),%eax
8048400:
8985ecfeffffmov%eax,0xfffffeec(%ebp)
8048406:
8b4508mov0x8(%ebp),%eax
8048409:
83c020add$0x20,%eax
18.假设以下C语言函数compare_str_len用来判断两个字符串的长度,当字符串str1的长度大于str2的长度时函数返回值为1,否则为0。
1intcompare_str_len(char*str1,char*str2)
2{
3returnstrlen(str1)-strlen(str2)>
0;
4}
已知C语言标准库函数strlen原型声明为“size_tstrlen(constchar*s);
”,其中,size_t被定义为unsignedint类型。
请问:
函数compare_str_len在什么情况下返回的结果不正确?
为什么?
为使函数正确返回结果应如何修改代码?
19.考虑以下C语言程序代码:
1intfunc1(unsignedword)
3return(int)((word<
<
24)>
>
24);
4}
5intfunc2(unsignedword)
6{
7return((int)word<
24)>
24;
8}
假设在一个32位机器上执行这些函数,该机器使用二进制补码表示带符号整数。
无符号数采用逻辑移位,带符号整数采用算术移位。
请填写表2.14,并说明函数func1和func2的功能。
表2.14题19用表
w
func1(w)
func2(w)
机器数
值
127
128
255
256
20.填写表2.15,注意对比无符号整数和带符号整数的乘法结果,以及截断操作前、后的结果。
表2.15题20用表
模式
x×
y(截断前)
y(截断后)
无符号
110
010
带符号
001
111
21.以下是两段C语言代码,函数arith()是直接用C语言写的,而optarith()是对arith()函数以某个确定的M和N编译生成的机器代码反编译生成的。
根据optarith(),可以推断函数arith()中M和N的值各是多少?
#defineM
#defineN