学习日志:sq.c程序分析
1.sq.c完整代码
#include <stdio.h>
#include <stdlib.h>
int sq(int x) {
return x*x;
}
int main(int argc, char *argv[]) {
int i;
for (i = 1; i < argc; i++) {
int x = atoi(argv[i]);
int sx = sq(x);
printf("sq(%d) = %d\n", x, sx);
}
return 0;
}
2.代码分析
(1)第11行,atoi()(在标准库<stdlib.h>中)
C 库函数 int atoi(const char *str) 把参数 str 所指向的字符串转换为一个整数(类型为 int 型)。
(2)调用之前写的“sq()”函数,计算平方。
3.带参数运行程序
注:运行环境为ubuntu 64位
(1)在命令行中输入“gcc -o sq.o sq.c”及“./sq.o 12 65535 40000 50000 400000 500000”得到以下结果:
①运行结果分析
(1)第一、三行结果并未溢出,皆有sx = x^2 。
(2)第二、四、五、六行明显溢出。以“65535”为例,其二进制为“1111 1111 1111 1111 ”,65535×65535 = 4292836225,其二进制为“1111 1111 1111 1110 0000 0000 0000 0001”,由于“sx”为有符号整形,第一位为符号位,故最后值为“-131071”
4.反汇编结果
(1)在命令行中输入“objdump -d sq.o”,其中main函数和sq函数的内容如下:
总体来看可以发现:一条汇编语句与机器码一一对应。