汇编语言 - 实验1

一、配置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]

按理说应该没差, 然而实测结果如下:

这是怎么回事呢?我暂时没法回答。舍友说是缓存读写的问题,这就不懂了……

猜你喜欢

转载自www.cnblogs.com/KakagouLT/p/9297454.html