C指针原理(3)-AT&T汇编
2018-11-24 09:08
351 查看
Linux 平台的标准汇编器是 GAS,它是 GCC 所依赖的后台汇编工具,通常包含在 binutils 软件包中,
--gstabs 告诉汇编器在生成的目标代码中加上符号表,我们首先完成汇编:
as -gstabs -o hello.o hello.s
汇编器产生的目标代码必须经过链接器的处理才能生成可执行代码 ,Linux 使用 ld 作为标准的链接程序,它同样也包含在 binutils 软件包中。我们接着进行链接:
ld -o hello hello.o
有了符号表,我们就好进行调试。
先运行一下,看看效果:
./hello hello,world ABCD GDB做为LINUX程序员的一个重要的调试工具,同样适用于汇编编写的程序,我们用GDB对上面代码进行一些简单的调试操作 首先打开hello程序: gdb hello GNU gdb (GDB) 7.1-ubuntu Copyright (C) 2010 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "x86_64-linux-gnu". For bug reporting instructions, please see: <http://×××w.gnu.org/software/gdb/bugs/>... Reading symbols from /home/deepfuture-lx/private/mytest/hello...done. 然后,我们可以使用list命令列出源代码 (gdb) list 1 .section .data#初始化的变量 2 output: 3 .ascii "hello,world\n" 4 #要打印的字符串,.data为初始化值的变量。output是标签,指示字符串开始的位置,ascii为数据类型 5 .section .bss#未初始化的变量,由0填充的缓冲区 6 .lcomm num,20 7 #lcomm为本地内存区域,即本地汇编外的不能进行访问。.comm是通用内存区域。 8 .section .text#汇编语言指令码 9 .globl _start#启动入口 10 _start: 使用break命令设置断点 (gdb) break 17 Breakpoint 1 at 0x4000c6: file hello.s, line 17. 运行至断点 (gdb) run Starting program: /home/deepfuture-lx/private/mytest/hello hello,world Breakpoint 1, _start () at hello.s:17 继续运行下条语句 17 movl $0,%eax (gdb) next 18 movl $num,%edi 显示所有寄存器的值 (gdb) info registers rax 0x0 0 rbx 0x1 1 rcx 0x60011c 6291740 rdx 0xc 12 rsi 0x0 0 rdi 0x0 0 rbp 0x0 0x0 rsp 0x7fffffffe2d0 0x7fffffffe2d0 r8 0x0 0 r9 0x0 0 r10 0x0 0 r11 0x0 0 r12 0x0 0 r13 0x0 0 r14 0x0 0 r15 0x0 0 rip 0x4000cb 0x4000cb <_start+27> eflags 0x202 [ IF ] cs 0x33 51 ss 0x2b 43 ds 0x0 0 es 0x0 0 fs 0x0 0 ---Type <return> to continue, or q <return> to quit--- gs 0x0 0 (gdb) next 19 movl $65,1(%edi)#A 的ascii 按十六进制格式输出edi寄存器的值。/x表示16进制,/d表示10进制,/t表示二进制 (gdb) print/x $rdi $3 = 0x600128 继续运行 (gdb) next 20 movl $66,2(%edi)#B 的ascii 显示某个内存位置的值,x/nyz,其中n为字段数,y为格式(c为字符,d为10进制,x为16进制),z为字段长度(b为字节,n为16位字,w为32位字) (gdb) next 21 movl $67,3(%edi)#C 的ascii (gdb) x/3cb &num 0x600128 <num>: 0 '\000' 65 'A' 66 'B' (gdb) next 22 movl $68,4(%edi)#D 的ascii (gdb) next 23 movl $10,5(%edi)#\n的ascii (gdb) next 25 movl $4,%eax#调用的系统功能,4为write (gdb) x/4cb &num 0x600128 <num>: 0 '\000' 65 'A' 66 'B' 67 'C' 退出gdb (gdb)quit
相关文章推荐
- C指针原理(4)-AT&T汇编
- C指针原理(5)-AT&T汇编
- C指针原理(9)-C内嵌汇编
- C指针原理(85)-helloworld的C程序汇编剖析(1)
- C指针原理(8)-C内嵌汇编
- C指针原理(27)-汇编分析C指针机制
- C指针原理(86)-helloworld的C程序汇编剖析(2)
- 数组指针 原理以及三个经典C程序的解惑 C知识回顾第二天
- C指针原理(11)
- 汇编语言理解指针(指针就是汇编的间接寻址,其实就是一个简单方便的运算指令,计算完毕直接就赋值,不是从内存中去取值后赋值)
- c语言==野指针形成原理、造成的危害及避免方法(22)
- AT&T 汇编语法
- X86 寻址方式、AT&T 汇编语言相关知识、AT&T 与 Intel 汇编语言的比较、gcc 嵌入式汇编
- [学习小记] 从汇编角度看局部变量的分配及数组名与指针的关系 .
- AT&T汇编——写在开始之前
- AT&T汇编语言——简单实例及工具演示
- C指针原理(39)-编译基本原理-语法树及其实现
- AT&T与Intel格式的汇编语法
- gcc内嵌的汇编at&a汇编(初览)
- 编译器是如何用汇编语言实现C++的虚函数表和隐式传递this指针(三)