as ld gcc
as命令是gas软件,我们知道在linux下,可以调试,链接,生成可执行文件的方式有多种。可以编译成链接文件的类似dos软件的有nasm(intel汇编指令),类似dos的masm,还有就是gnu的开源的gas,当然也可以用gcc,gdb来调试汇编。相对来说在linux下你有更多的选择,ld命令是用来把链接文件生成可执行文件。下面我们就以一个简单的例子介绍使用这些工具。
这里写的汇编代码是at&t汇编格式,我用intel汇编来解释它(也就是会给出intel汇编的书写方式)
#cpuid.s 简单的例子 获的cpu相关的信息 intel用“;”来注释
.section .data data segment 数据区内容 ends data
output:
.ascii "The processor Vendor ID is 'xxxxxxxxxxxxx'\n"
.section .bss stack segment 堆栈区内容 ends stack
.section .text code segment 代码区 ends code
.globl _start
_start:
movl $0,%eax mov ax,0
cpuid cpuid
movl $output,%edi mov di,data
movl %ebx,28(%edi) mov ds:[28],bx
movl %edx,32(%edi) mov [32 ],dx
movl %ecx,36(%edi) mov [36],cx
movl $4,%eax mov ax,4
movl $1,%ebx mov bx,1
movl $output,%ecx mov cx,data
movl $42,%edx mov dx,42
int $0x80 int 80h
movl $1,%eax mov ax,1
movl $0,%ebx mov bx,0
int $0x80 int 80h
上面的intel汇编指令 只是把at&t的语句用intel的方式表示出来,不一定能编译通过,这样只是方便了解intel汇编人了解这个at&t的小程序,现在来把它编译成可执行文件。
sniffer@sniffer-desktop:~/programe/asm$ ls
1.asm 1.asm~ 3_9.asm 4_1.asm cpuid.s cpuid.s~ mod.s tool.iso
sniffer@sniffer-desktop:~/programe/asm$
sniffer@sniffer-desktop:~/programe/asm$ as -o cpuid.o cpuid.s //使用as命令编译成链接文件
sniffer@sniffer-desktop:~/programe/asm$ ld -o cpuid cpuid.o //使用ld命令把链接文件生成可执行文件
sniffer@sniffer-desktop:~/programe/asm$ ls
1.asm 3_9.asm cpuid cpuid.s mod.s //可以看到生成了两个文件cpuid.o cpuid第一个文件是as命令生成的,cpuid是个可执行文件是ld命令生成的。
1.asm~ 4_1.asm cpuid.o cpuid.s~ tool.iso
sniffer@sniffer-desktop:~/programe/asm$ ls -l
总用量 636
-rw-r--r-- 1 sniffer sniffer 46 2010-03-09 10:11 1.asm
-rw-r--r-- 1 sniffer sniffer 21 2010-03-09 09:52 1.asm~
-rw-r--r-- 1 sniffer sniffer 131 2010-03-16 09:26 3_9.asm
-rw-r--r-- 1 sniffer sniffer 18 2010-03-16 16:52 4_1.asm
-rwxr-xr-x 1 sniffer sniffer 663 2010-04-12 09:13 cpuid
到这里我们就得到可执行文件cpuid可以通过上面的命令 ls -l查看
下面我们用gcc,gdb来编译链接at&t汇编。
sniffer@sniffer-desktop:~/programe/asm$ rm cpuid cpuid.o //首先删除那两个文件
sniffer@sniffer-desktop:~/programe/asm$ gcc -o cpuid cpuid.s
/tmp/cclGvp8t.o: In function `_start': //错误提示,用gcc编译的时候要把代码开始表示修改为main 看提示下面有说
(.text+0x0): multiple definition of `_start'
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/crt1.o:(.text+0x0): first defined here
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/crt1.o: In function `_start':
(.text+0x18): undefined reference to `main'
collect2: ld returned 1 exit status
sniffer@sniffer-desktop:~/programe/asm$ emacs cpuid.s //使用编辑器eamcs 把标示改为“main” emacs替换字符的指令是 alt+x --》输入replace-string 回车 输入要替换的字符这里是“_start” 回车 输入替换字符,这里是“main”回车 好了 保存 退出 emacs
sniffer@sniffer-desktop:~/programe/asm$ gcc -o cpuid cpuid.s //使用gcc可以跳过链接文件直接就生成可执行文件 ,要使用gdb来调试 要加参数 -g
sniffer@sniffer-desktop:~/programe/asm$ ls -l
总用量 636
-rw-r--r-- 1 sniffer sniffer 46 2010-03-09 10:11 1.asm
-rw-r--r-- 1 sniffer sniffer 21 2010-03-09 09:52 1.asm~
-rw-r--r-- 1 sniffer sniffer 131 2010-03-16 09:26 3_9.asm
-rw-r--r-- 1 sniffer sniffer 18 2010-03-16 16:52 4_1.asm
-rwxr-xr-x 1 sniffer sniffer 7178 2010-04-12 09:51 cpuid
-rw-r--r-- 1 sniffer sniffer 390 2010-04-12 09:49 cpuid.s
sniffer@sniffer-desktop:~/programe/asm$ gcc -g -o cpuid1 cpuid.s
-rwxr-xr-x 1 sniffer sniffer 7178 2010-04-12 09:51 cpuid
-rwxr-xr-x 1 sniffer sniffer 7654 2010-04-12 09:54 cpuid1 //可以看出加了参数文件变大了(至于为什么要变大,简单点就是要加入一些信息利用调试),这时候就可以用gdb来调试cpuid1了,在这里gdb的功能类似于dos的debug,当然比debug就牛多了。as命令要可以调试的话也要加参数的,参数是-gstabs。到这里如果你不想写at&t汇编,要用intel汇编的话可以使用nasm,用gdb来调试。
想了解更多at&t汇编的知识可以看richard blum的汇编语言程序设计,想了解更多intel汇编知识可以看王爽老师的汇编语言(事实是本人从那本书里系统学习汇编知识,自学汇编必看的第一本书),想了解更多上面使用的命令的信息,请查看man手册
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步