Linux
文章平均质量分 57
swordmanwk
这个作者很懒,什么都没留下…
展开
-
在linux下手工安装g++
最近又开始重新学习C++,准备在家里搞个C++开发环境,我以前安装过一个linux的虚拟机,redhat linux 7的版本,发现默认只安装了gcc,不能使用g++,然后搜索了一下网页,搞了好半天才安装好环境,整理一下,供参考。首先,我的环境上的gcc版本号是:gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-28),系统是x86_64的linux。然后,需要获取rpm包,我的虚拟机不能上网,所以不能自动安装,需要手工下载后安装。找了几个网站,找到和我的gcc版本原创 2021-01-01 15:18:10 · 1541 阅读 · 0 评论 -
32位汇编语言学习笔记(23)--大小写转换程序2
SECTION .bss ; Section containing uninitialized data BUFFLEN equ 1024 ; Length of buffer Buff: resb BUFFLEN ; Text buffer itself SECTION .data ; Section containing initialised dataSECTION .text ; Sect转载 2014-12-28 08:48:22 · 1262 阅读 · 0 评论 -
32位汇编语言学习笔记(22)--大小写转换程序1
这个汇编程序出自《Assembly Language step by step programming with linux》第8章,用于大小写字符转换。section .bss Buffresb 1section .datasection .text global_start_start:转载 2014-12-27 21:16:38 · 1415 阅读 · 0 评论 -
32位汇编语言学习笔记(21)--用NASM实现Hello World小程序
前面20篇汇编学习笔记主要是学习《深入理解计算机系统》过程中所记录的笔记,接下来打算学一下另外一本书《Assembly Language step by step programming with linux》。首先需要安装NASM汇编器,例如:rpm –ivh nasm-2.10-1.i386.rpm《Assembly Language step by step progra转载 2014-12-26 20:59:41 · 7929 阅读 · 0 评论 -
32位汇编语言学习笔记(42)--测试时间相关函数
此程序出自《Assembly Language step by step programming with linux》第12章,用于演示时间相关的libc库函数的使用,程序中使用了如下的libc库函数:time_t time( time_t *timer );char *ctime( const time_t *timer );double difftime( time_t转载 2015-01-15 07:10:58 · 920 阅读 · 0 评论 -
32位汇编语言学习笔记(20)--栈破坏检测
还是使用前面缓冲区溢出的那个程序,使用-fstack-protector编译选项。gcc -O1 -m32-fstack-protector-o bufovf bufovf.c对映像文件进行反汇编:objdump -d bufovf得到如下结果:bufovf: file format elf32-i386……08048524 : 8048524:原创 2014-12-22 21:45:42 · 3436 阅读 · 0 评论 -
32位汇编语言学习笔记(19)--缓冲区溢出实验
如下示例代码,摘录自《深入理解计算机系统》:#include #include size_t strlen(const char *s){ intlen = 0; while (*(s++)) len++; return len;} char *strcpy(char *dest, c原创 2014-12-16 20:17:57 · 1937 阅读 · 0 评论 -
32位汇编语言学习笔记(41)--fgets等函数的使用
在《32位汇编语言学习笔记(13)--函数的调用》曾分析过c函数的调用过程,对于c函数的默认调用约定cdecl,要求函数参数的压栈顺序是从右向左,由调用方来清理栈。下面示例程序会使用libc库的几个函数:char *fgets( char *string, int n, FILE *stream );int printf( const char *format [, argumen转载 2015-01-13 07:41:05 · 1435 阅读 · 0 评论 -
32位汇编语言学习笔记(17)--结构体
结构体成员的访问:struct rec { inti; int j; int a[3]; int *p;}; void copy(struct rec *r){ r->j = r->i;} gcc -O1 -S -m32 struct1.c c原创 2014-12-06 19:14:33 · 2196 阅读 · 0 评论 -
32位汇编语言学习笔记(18)--联合
C语言提供的联合语法,可以使得多种数据类型的数据共享同一块内存地址。示例1:unsigned float2bit(float f){ union { floatf; unsignedu; }temp; temp.f = f; return temp.u;原创 2014-12-07 11:27:16 · 932 阅读 · 0 评论 -
32位汇编语言学习笔记(40)--在汇编代码中使用libc库函数
前面的汇编代码没有使用libc库函数,都是通过直接进行系统调用完成。《32位汇编语言学习笔记(21)--用NASM实现Hello World小程序》通过系统调用实现了一个HelloWorld小程序,我们要通过在汇编中调用libc函数实现一个新版本的HelloWorld小程序:SECTION .data ; Section containing initialised data转载 2015-01-12 07:32:54 · 1454 阅读 · 0 评论 -
32位汇编语言学习笔记(43)-- 生成随机数
此程序出自《Assembly Language step by step programming with linux》第12章,用于演示随机数函数的使用,共涉及两个随机数函数:void srand( unsigned int seed ); //设置随机数种子int rand( void ); //获取随机数先看程序:[SECTION .data] ; Section转载 2015-01-17 07:57:13 · 6616 阅读 · 0 评论 -
32位汇编语言学习笔记(25)--xlat指令
xlat指令用于从内存的转换表读入一个字节更新al寄存器的内容。在指令执行前,要求al寄存器保存转换表的索引值,ebx寄存器保存转换表的起始地址。《Assembly Language step by step programming with linux》第9章有一个使用这个指令的示例程序,此程序仍然用于把小写字母转换成大写字母:SECTION .data ; Section cont转载 2014-12-29 20:02:53 · 4225 阅读 · 0 评论 -
32位汇编语言学习笔记(31)--rep stosb指令
rep stosb是最简单的字符串指令,用于在目标字符串中填入指定的字符。首先看一个小程序:section .data EditBuff: db 'abcdefghijklm ',10 BUFFERLEN equ $-EditBuff ENDPOS equ 12 INSRTPOS equ 0 FILLCHR equ 35 ;'#' secti转载 2015-01-06 07:28:45 · 10384 阅读 · 0 评论 -
32位汇编语言学习笔记(30)--rep movsb指令
在《32位汇编语言学习笔记(19)--缓冲区溢出实验》中,我们曾遇到过一个字符串指令:repnz scas,现在我们要学习另外一个字符串指令:rep movsb。首先看一个小程序:section .data EditBuff: db 'abcdefghijklm ',10 BUFFERLEN equ $-EditBuff ENDPOS equ 12转载 2015-01-05 21:27:55 · 9907 阅读 · 1 评论 -
32位汇编语言学习笔记(29)--在NASM中使用宏
宏的语法规则与汇编指令没有关系,只是为了管理代码复杂度而设计的类似于高级语言的特性。NASM的宏语法格式如下:%macro 宏名称 参数个数宏的内容%endmacro宏的第一个参数用%1表示,第二个参数用%2表示,依次类推。《Assembly Language step by step programming with linux》在第10章给出了一个使用宏版本的光标控转载 2015-01-04 07:32:51 · 2792 阅读 · 0 评论 -
32位汇编语言学习笔记(28)--一个简单的光标控制程序
这是《Assembly Language step by step programming with linux》第10章的一个程序,里面用了两条光标控制命令:[;H,这条命令用于输出光标的位置,esc是不可见字符,其ASCII码是27,y和x是控制台屏幕坐标位置,从屏幕的左上角计算。[2J,这条命令用于清屏。 程序源代码如下:; Executable name : ea转载 2015-01-03 07:35:12 · 2069 阅读 · 0 评论 -
32位汇编语言学习笔记(27)--HexDump3程序
HexDump2程序还可以再改进,通过提取公共函数到一个单独的文件,HexDump2原来的代码被分解到两个asm文件中:hexdump3.asm和textlib.asm。因为分解为两个文件,互相间的符号引用需要通过EXTERN和GLOBAL这两个关键字。EXTERN声明符号是其他模块的外部符号,GLOBAL声明本模块的符号是全局符号,其他模块可见。以下是hexdump3.a转载 2015-01-01 18:14:12 · 1187 阅读 · 0 评论 -
32位汇编语言学习笔记(26)--HexDump2程序
HexDump2程序是HexDump程序的改进版本,HexDump2把代码封装成函数,功能上要完善一些,实现要比前面的版本复杂的多。先介绍几个指令:pushad指令,会把所有的通用寄存器压入堆栈,通用寄存器包括eax,ebx,ecx,edx,esp,ebp,esi,edi。popad指令与pushad指令相对应,会从堆栈弹出所有通用寄存器的值。test指令,转载 2015-01-01 12:20:56 · 1221 阅读 · 0 评论 -
32位汇编语言学习笔记(45)--测试简单文件操作接口(完)
这是《Assembly Language step by step programming with linux》书中的最后一个程序,也是全书中的最复杂的一个程序。首先看一下这个程序使用的一些新的c接口:FILE *fopen( const char *filename, const char *mode );int fclose( FILE *stream );char转载 2015-01-18 09:38:19 · 1829 阅读 · 0 评论 -
32位汇编语言学习笔记(44)--显示命令行参数(3)
与前面的版本不同,这个是使用libc库版本的显示命令行参数程序,因为main函数并不是程序的入口点,而是由libc库的代码调用,所以命令行参数在栈上的位置有不同,先看示例程序:[SECTION .data] ; Section containing initialised data ArgMsg db "Argument %d: %s",10,0 [SECTION .b转载 2015-01-17 11:02:41 · 1007 阅读 · 0 评论 -
32位汇编语言学习笔记(24)--HexDump程序
此程序的目的是把输入的文本字符转换成16进制的格式输出。SECTION .bss ; Section containing uninitialized data BUFFLEN equ 16 ;We read the file 16 bytes at a time转载 2014-12-28 15:14:53 · 1220 阅读 · 0 评论 -
32位汇编语言学习笔记(39)--显示环境变量
前面的程序显示了程序的命令行参数,在程序的栈中,在命令行参数字符指针的上面就是保存的环境变量的字符串指针,以下程序用于显示环境变量:SECTION .data ; Section containing initialised data ErrMsg db "Terminated with error.",10 ERRLEN equ $-ErrMsg SECTION .bs转载 2015-01-11 19:31:44 · 1017 阅读 · 0 评论 -
32位汇编语言学习笔记(16)--变长数组
typedef int *var_matrix; int var_prod_ele(var_matrix A, var_matrixB, int i, int k, int n){ int j; int result = 0; for (j = 0; j result += A[i原创 2014-12-06 07:16:18 · 1240 阅读 · 0 评论 -
32位汇编语言学习笔记(37)--显示命令行参数
这个程序出自《Assembly Language step by step programming with linux》第11章,用于显示程序的命令行参数,首先看代码:SECTION .data ; Section containing initialised data ErrMsg db "Terminated with error.",10 ERRLEN equ $-E转载 2015-01-11 12:10:21 · 1471 阅读 · 0 评论 -
32位汇编语言学习笔记(12)--分析switch语句的汇编代码
switch语句可以根据整数索引值进行多重分支选择,代码的可读性好,switch语句的汇编实现是通过跳转表来完成的,这样执行效率也很高。int switch_eg(int x){ int result = x; switch (x) { case 100: resu原创 2014-11-30 09:59:41 · 4618 阅读 · 0 评论 -
32位汇编语言学习笔记(11)--条件传送指令
条件传送指令如下:cmove S, D //等于0时传送cmovz S, D //同cmovecmovne S, D //不等于0时传送cmovnz S, D //同cmovne cmovs S, D //负数时传送cmovns S, D //非负数时传送 cmovg S, D //有符号大于时传送cmov原创 2014-11-29 19:31:41 · 18827 阅读 · 0 评论 -
32位汇编语言学习笔记(8)--分析do-while循环的汇编代码
gcc会把do-while循环转换成如下形式的代码,再生成汇编代码:loop:表达式…t =循环条件if(t) goto loop 示例1:int dw_loop(int x, int y, int n){ do{ x+= n; y*= n;原创 2014-11-23 14:23:59 · 2101 阅读 · 0 评论 -
32位汇编语言学习笔记(7)--跳转指令
正常情况下,指令是按照顺序执行的,跳转指令会导致程序的执行切换到一个新位置。jmp跳转指令是无条件跳转指令。可以是直接跳转,即跳转指令的目的地址通常由标号指明。也可以是间接跳转:jmp *%eax //用eax值作为跳转目的地址。jmp *(%eax) //用eax指向的内存中保存的地址值作为跳转目的地址。 有条件跳转指令如下:j原创 2014-11-23 09:41:32 · 3280 阅读 · 0 评论 -
32位汇编语言学习笔记(5)--特殊的算术操作
imull S,edx:eax = eax * S(edx表示64位的高32位,eax表示低32位),有符号64位乘法。mull S,edx:eax = eax * S,无符号64位乘法。cltd,eax寄存器中的数,按照符号位扩展到edx,转为8个字节。idivl S,edx =edx:eax mod S,eax =edx:eax / S,有符号除原创 2014-11-22 11:24:49 · 1414 阅读 · 0 评论 -
32位汇编语言学习笔记(6)--设置条件码
条件码保存在条件码寄存器中,用于描述算术和最近逻辑操作的属性。最常用的条件码有:CF:进位标志。ZF:零标志。SF:符号标志。OF:溢出标志。 算术和逻辑操作指令都会修改条件码的值,但是leal指令不会修改条件码的值。此外,cmp指令和test指令也会修改条件码。cmp S2, S1将S1-S2的结果与0进行比较,分别原创 2014-11-22 15:59:42 · 4632 阅读 · 1 评论 -
32位汇编语言学习笔记(3)--leal和算术运算指令
leal指令用于加载有效地址(loadeffective address)。leal指令的目的操作数必须是寄存器。实际上leal指令有时用于与加载地址无关的场景。示例:leal 6(%eax), %edx //把eax的值+6放入edx中。leal (%eax, %ecx), %edx //把eax与ecx的值装入edx中。leal (%ea原创 2014-11-16 08:33:43 · 22545 阅读 · 2 评论 -
32位汇编语言学习笔记(2)--数据传送指令
汇编指令带有后缀:对于访问一个字节数据类型,后缀是b。对于访问两个字节数据类型,后缀是w。对于访问四个字节数据类型,后缀是l。例如,对于mov指令,有movb, movw, movl。原创 2014-11-15 17:38:02 · 2497 阅读 · 0 评论 -
32位汇编语言学习笔记(1)--简单示例
程序计数器,IA32指令集中通常称为PC,用%eip表示,指示即将执行的下一条指令在存储器中的地址。/* $begin sum-c */int accum = 0; int sum(int x, int y){ int t = x + y; accum += t; ret原创 2014-11-15 17:24:44 · 2798 阅读 · 0 评论 -
32位汇编语言学习笔记(10)--分析for循环的汇编代码
for循环和while循环差不多,都是条件判断在先。gcc用类似处理while循环的方式先把for循环转换成包含do-while循环的代码,再转换成汇编代码。 示例:int fib_f(int n){ int i; int val = 1; int nval = 1; for原创 2014-11-29 18:40:00 · 2678 阅读 · 0 评论 -
32位汇编语言学习笔记(13)--函数的调用
cdecl是c语言的函数默认调用约定,这种调用约定要求函数参数的压栈顺序是从右向左。假设函数是 int func(int arg1, int arg2, int arg3),那么参数3先压入栈,参数1最后压入栈,栈的生长方向是向低地址方向生长,所以参数3的地址最大。函数的调用栈如下图所示:esp是栈指针,总是指向栈顶,ebp是栈帧指针,指向为函数分配原创 2014-11-30 20:24:01 · 4485 阅读 · 1 评论 -
32位汇编语言学习笔记(9)--分析while循环的汇编代码
while循环与do-while循环不同,是先判断循环条件。gcc会把while循环转换成如下格式的代码,再生成汇编代码:if (循环条件不成立)goto donedo{表达式…}while(循环条件) done:... 示例1:int loop_while(int a, int b原创 2014-11-24 20:44:35 · 3818 阅读 · 0 评论 -
32位汇编语言学习笔记(38)--显示命令行参数(2)
showargs1程序是把命令行参数字符串的地址从栈中拷贝到全局数组变量里,然后把结果显示出来,showargs2程序对此进行了改进,直接从栈上读取命令行参数字符串的地址,而不再进行拷贝操作,程序大同小异:SECTION .data ; Section containing initialised data ErrMsg db "Terminated with error.",转载 2015-01-11 15:06:51 · 855 阅读 · 0 评论 -
32位汇编语言学习笔记(36)--repne scasb指令
repne scasb指令,用于扫描字符串,计算字符串的长度,如下两条指令:cldrepne scasb对应的等价指令是:scans:inc edi dec ecx je loopdone cmp byte [edi-1],al jne scansloopdone:下面看一个示例程序:section .data Edi原创 2015-01-11 10:34:10 · 16075 阅读 · 0 评论 -
32位汇编语言学习笔记(35)--显示ASCII表
这个程序出自《Assembly Language step by step programming with linux》第11章,首先需要先介绍几条指令:jcxz label,当cx寄存器等于0时,跳转。jecxz label,当ecx寄存器等于0时,跳转。loopnz label,ecx=ecx-1,当ecx寄存器不等于0时并且ZF标志位未被设置时跳转,如果ecx寄存器等于转载 2015-01-10 08:10:26 · 1644 阅读 · 0 评论