zoukankan      html  css  js  c++  java
  • 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' "
    .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手册

  • 相关阅读:
    Python装饰器实现几类验证功能做法(续)
    10周年整
    年中review
    Javascript 模块化开发上线解决方案
    AMDJS编译工具
    第三方组件接入方案(演示文稿图片)
    代码打包预处理工具
    manifest资源提取工具
    也来山寨一版Flappy Bird (js版)
    2014 todo list
  • 原文地址:https://www.cnblogs.com/wzf365/p/3273195.html
Copyright © 2011-2022 走看看