设为首页 加入收藏 网站搜索 繁體中文 中国建站网 — 站长资源平台

Linux汇编指南

来源本站整理 作者:佚名 时间:2006-7-30 21:50:24 该文得分0

  摘要:The following is designed to be a Linux equivalent to "Developing Assembly Language Programs on a PC" by Douglas V. Hall. This tutorial requires the following:
  Introduction
  
    The following is designed to be a Linux equivalent to "Developing Assembly Language Programs on a PC" by Douglas V. Hall. This tutorial requires the following:
  
    an i386 family PC running Linux
  
    as, the GNU assembler (included with any gcc installation) ld, the GNU linker (also included with gcc) gdb, the GNU debugger The tutorial was developed on a 5.1 Redhat Linux installation running a 2.0.34 version kernel and the version 5 and 6 C language libraries with ELF file format. But I have tried to make the tutorial as general possible with respect to Linux systems. I highly recommend working through this tutorial with "as" and "gdb" documentation close at hand.
  
    Overview
  
    The process of developing an assembly program under linux is somewhat different from development under NT. In order to accommodate object oriented languages which require the compiler to create constructor and destructor methods which execute before and after the execution of "main", the GNU development model embeds user code within a wrapper of system code. In other words, the user's "main" is treated as a function call. An advantage of this is that user is not required to initialize segment registers, though user code must obey some function requirements.
  
    The Code
  
    The following is the Linux version of the average temperature program. It will be referred to as "average.s". Note: Assembly language programs should use the ".s" suffix.
  
  /* linux version of AVTEMP.ASM CS 200, fall 1998 */
  .data /* beginning of data segment */
  /* hi_temp data item */
   .type hi_temp,@object /* declare as data object */
   .size hi_temp,1 /* declare size in bytes */
  hi_temp:
   .byte 0x92 /* set value */
  /* lo_temp data item */
   .type lo_temp,@object
   .size lo_temp,1
  lo_temp:
   .byte 0x52
  /* av_temp data item */
   .type av_temp,@object
   .size av_temp,1
  av_temp:
   .byte 0
  /* segment registers set up by linked code */
  /* beginning of text(code) segment */
  .text
   .align 4 /* set 4 double-word alignment */
  .globl main /* make main global for linker */
   .type main,@function /* declare main as a function */
  main:
   pushl %ebp /* function requirement */
   movl %esp,%ebp /* function requirement */
   movb hi_temp,%al
   addb lo_temp,%al
   movb $0,%ah
   adcb $0,%ah
   movb $2,%bl
   idivb %bl
   movb %al,av_temp
   leave /* function requirement */
   ret /* function requirement */
  
    assembly instructions
  
    This code may be assembled with the following command:
  
  as -a --gstabs -o average.o average.s
  
    The "-a" option prints a memory listing during assembly. This output gives the location variables and code with respect to the beginnings of the data and code segments. "--gstabs" places debugging information in the executable (used by gdb). "-o" specifies average.o as the output file name (the default is a.out, which is confusing since the file is not executable.)
  
    The object file (average.o) can then be linked to the Linux wrapper code in order to create an executable. These files are crt1.o, crti.o and crtn.o. crt1.o and crti.o provide initialization code and crtn.o does cleanup. These should all be located in "/usr/lib" be may be elsewere on some systems. They, and their source, might be located by executing the following find command:
  
    find / -name "crt*" -print
  
    The link command is the following:
  
  ld -m elf_i386 -static /usr/lib/crt1.o /usr/lib/crti.o
  -lc average.o /usr/lib/crtn.o
  
    "-m elf_i386" instructs the linker to use the ELF file format. "-static" cause static rather than dynamic linking to occur. And "-lc" links in the standard c libraries (libc.a). It might be necessary to include "-I/libdirectory" in the invocation for ld to find the c library.
  
    It will be necessary to change the mode of the resulting object file with "chmod +x ./a.out".
  
    It should now be possible to execute the file. But, of course, there will be no output.
  
    I recommend placing the above commands in a makefile .
  
    debugging
  
    The "--gstabs" option given to the assembler allows the assembly program to be debugged under gdb. The first step is to invoke gdb:
  
    gdb ./a.out
  
    gdb should start with the following message:
  
  [bjorn@pomade src]$ gdb ./a.out
  
    GNU gdb 4.17
  
    Copyright 1998 Free Software Foundation, Inc.GDB is free software, covered by the GNU General Public License, and

[1] [2]  下一页

相关文章
广告赞助
网友评论

共有 0 位网友发表了评论,平均得分: 0 查看完整内容

用户名:

分 值:100分 85分 70分 55分 40分 25分 10分 0分

内 容:

(注“”为必填内容。) 验证码: 验证码,看不清楚?请点击刷新验证码