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手册

posted @ 2013-08-21 17:51  三六五  阅读(788)  评论(0编辑  收藏  举报