一、配置Linux
这部分已经轻车熟路了,只不过因为要下载32bit的ubuntu,所以费了点周折,最后总算在华为镜像站找到了资源,给花企点个赞(
关于软件的版本,要求用man查询Vim/Git/GCC/AS/OBJDUMP/GDB的版本。然而发现这些软件的查询版本命令全都是xxx --version...例如:
vim --version
二、用汇编写个魔改helloworld
以上是代码,保存到hear.S
然后用以下命令做成程序
as -o heart.o heart.S
gcc -o heart.o heart
话说我一直搞不明白,怎么一下是-o heart.o heart,一下是heart -o heart.o,这顺序真没个准头……
最终结果如下
三、工具实践
1.objdump反汇编
用以下命令将刚才做好的heart.o反汇编(其实也可以反汇编heart本身?)
objdump -D heart.o>dog
然后在msg部分有以下信息
说实话,看不懂……但是如果说要看学号部分在哪,那应该就是20行到27行了吧……
2.gcc的使用
流程是hello.c -> hello.i -> hello.s -> hello.o -> hello
代码如下,有点难记……太乱了
gcc -E hello.c -o hello.i gcc -S hello.i gcc -c hello.s gcc -o hello hello.o
如果一步到位,.c到可执行程序,就很简单了
gcc hello.c -o hello
3.vimrc的配置
这个需要先cd ~,然后自己创建.vimrc。里面可以写对vim的配置信息
cd ~ vi .vimrc #编辑.vimrc set nu #打开行号显示 #wq保存关闭
四、数据范围的问题
如果int分别赋值为40000*40000,50000*50000,会发生什么呢?
40000^2的结果是正确的,但50000^2的结果是错误的。
原因在于,40000是0000 0000 0000 0000 1001 1100 0100 0000
平方之后,是0101 1111 0101 1110 0001 0000 0000 0000,可以看到是没有触及到符号位,也没有溢出的。
50000则是1100 0011 0101 0000
平方的结果是1001 0101 0000 0010 1111 1001 0000 0000,触及到了符号位,但没有溢出。
如果截去符号位,对应的结果是352,516,352,与1,794,967,296相加后刚好是2,147,483,648。这就是计算机补码保存的结果。
为了解决这个问题,当然是要使用unsigned int,去除符号位。但是为了避免长远的问题,用unsigned long long或许更好一些。
五、矩阵执行时间比较
这是一个很有意思的问题:现在有两个矩阵,大小都是2048x2048。现在要把矩阵src的内容复制到dst,那么就有两种方法:
- for i 里面嵌套for j
- for j 里面嵌套for i
两种方法都在两层for中dst[i][j] = src[i][j]
按理说应该没差, 然而实测结果如下:
这是怎么回事呢?我暂时没法回答。舍友说是缓存读写的问题,这就不懂了……