C/C++知识点之C指针原理(3)-AT&T汇编
小标 2019-02-19 来源 : 阅读 588 评论 0

摘要:本文主要向大家介绍了 C/C++知识点之C指针原理(3)-AT&T汇编,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。

本文主要向大家介绍了 C/C++知识点之C指针原理(3)-AT&T汇编,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。

C/C++知识点之C指针原理(3)-AT&T汇编

 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 <//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:
<//×××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/C+频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程