主页 PC知识 网管技术 黑客帝国 安全技术 开放系统 程序设计 搜索 技术论坛

 

相关联接
 
RHU本级分类

技术开发
桌面应用
嵌入技术
问答(FAQ)
基础知识
企业应用&技巧

 
RHU阅读排行
·Grub安装、配置以及使用实例汇总讲解
·突破传统:Linux下如何架设BT服务器
·技术入门:怎样用Linux实现组播路由转发
·教您如何制作Red Hat 9自动安装光盘
·Linux应用技巧:用GRUB4DOS修复GRUB
·企业应用指南:Linux上的MRTG监控中心
·Linux揭开USB主机设计的神秘面纱
·Linux应用经验技巧:Linux用Nasm巧汇编
·经验技巧:如何对Apache做Web压缩
·Linux经验技巧:Kill多个进程的妙招

 
 
RHU最新文章
·用ubuntu server8.10做php-web服务器方法
·Ubuntu下命令行FTP客户端NcFTP安装使用
·Linux系统各版本的本地root密码破解方法
·分享:Linux操作系统下实现远程开机
·超级双系统 解决Linux与Windows双引导问题
·分享:Linux操作系统下的硬盘提速方案
·收集:Linux操作系统使用经验大分享
·让WordPress在Ubuntu上跑起来
·Vista下通过Grub4DOS建立Vista和Ubuntu
·优化Linux服务器硬盘性能的七个实用技巧

 
 
RHU相关搜索









 
 
RHU广而告之

 
 
>您的位置:首页 -> Linux/Unix-> 企业应用&技巧
Linux应用经验技巧:Linux用Nasm巧汇编

作者:RHU-TAC编辑员 来自:RHU网络采集 时间:2005-8-26 双击滚屏 收藏本页 字体:


点击 查看RHU2004全年文章


随着Linux的普及,如何在Linux平台下进行编程,尤其是汇编成为大家关注的一个问题,但是这方面资料却很少。在遍访网站和论坛后,我把收集到的资料结合本人总结的一些经验跟大家分享一下。

Nasm介绍

Linux下的汇编编译器有多种,语法也不尽相同,其中GAS是比较基本的汇编工具。但是GAS采用的不是我们通常在DOS体系下使用的汇编语法,它采用的是AT&T的语法格式,这是继承Unix的特点,与Intel语法格式有很大的不同。

作为一个从DOS转型到Linux的汇编爱好者,AT&T的格式不太容易接受,学习起来也非常困难。我要介绍的是另一种汇编工具Nasm,这跟DOS下用的Intel x86汇编风格的Masm类似,是Linux中语法与DOS最为相像的一种汇编工具。

下面就以hello.asm这个小程序为例,介绍如何用Nasm在Linux下进行汇编。

hello.asm 
hello world for Linux 
section .text                                 
extern puts                                   
global main                                   
                                              
main:                                         
   push dword msge ;                         
   call puts ;                                
   add  esp, byte 4 ;                         
   ret ;                                      
                                               
msge:                                         
   db “Hello World!”,0


Nasm编译命令如下:

Nasm -f elf hello.asm
gcc -o hello hello.o


“Nasm -f elf hello.asm”是将把hello.asm汇编成elf object文件。“gcc -o hello hello.o”会把hello.asm汇编成二进制可执行文件hello.com 。

Nasm -f命令的参数主要有aout和elf两种,如果不能确定Linux系统应该用aout还是elf,可以在Nasm目录中输入命令file Nasm,如果输出“Nasm: ELF 32-bit LSB executable i386(386 and up) Version 1”应该使用elf;如果输出“Nasm: Linux/i386 demand-paged executable(QMAGIC) ”应该使用aout。用命令Nasm -h可以取得Nasm命令行的完整说明。
程序说明

hello.asm是调用了Linux系统的puts函数,原理与调用DOS下C语言的函数相同,先用extern声明puts是外部函数,再把参数(即msg的地址)压入堆栈,最后call函数实现输出。 再来看一个程序:

section .text                                 
global main                                   
                                                
main:                                         
    mov eax,4 ;     4号调用                   
    mov ebx,1 ;     ebx送1表示输出           
    mov ecx,msge ;  字符串的首地址送入ecx     
    mov edx,14 ;    字符串的长度送入edx       
    int 80h ;       输出字串                  
    mov eax,1 ;     1号调用                   
      int 80h ;       结束                      
                                               
msge:                                         
    db “Hello World!”,0ah,0dh


这个程序与DOS程序十分相似,而且结果同hello.asm一样,它用的是Linux中的80h中断,相当于DOS下的21h中断,只是因为Linux是32位操作系统,所以采用了eax、ebx等寄存器。

Nasm与Masm的区别

1.大小写问题

与Linux系统一样,Nasm是区分大小写的,Hello与hello将是不同的标识符。而在DOS或OS/2下使用Masm进行汇编,需要加入UPPERCASE参数才能区分大小写。

2.对[ ]的使用

Nasm对[ ]的使用与Masm也有所不同,Nasm规定所有的表达式和内存操作数都必须写在[ ]中。下面举两个例子来说明。

Masm的语法:

mov ax,bar 
mov ax,es:[di]
mov ax,[di]+1


Nasm的语法:

mov ax,[bar]
mov ax,[es:di]
mov ax,[di+1]


3.关于变量类型

Nasm中不存储变量类型,Masm中即使是通过[ ]寻址方式的变量也必须要指定变量类型。Nasm中不支持LODS, MOVS、STOS、SCAS、CMPS、INS、OUTS等类型,只支持lodsb、lodsw等已经指定类型的操作,并且Nasm中不再有assume操作,段地址完全取决于存入段寄存器的值。

关于Nasm详细的使用方法及语法还可以参阅Nasm使用手册。

小结

Linux作为一个多用户的操作系统,与DOS有着非常大的区别的,特别涉及到操作系统原理时,与DOS可以说是截然不同。Linux操作系统实际是从抽象资源操作到具体硬件操作之间的接口。

对Linux这样的多用户操作系统来说,它需要避免用户对硬件的直接访问,并防止用户之间的互相干扰,所以Linux接管了BIOS调用和端口输入输出,如果要通过Linux对硬件进行访问就需要用到SystemCall。它实际上是许多C函数的集合,可以在汇编程序中被调用,调用方法与DOS下的汇编完全相同,并且用Nasm汇编时不用链接额外的库函数。


OVER

[1] 页 RedHyphone.Union 投稿邮箱
[特别声明]:
本站文章大多搜索转载自网络中,如果侵犯了您的权利,请告之我们。本站将立即删除。
本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。
查看评论】【向上滚屏】【关闭窗口】【 打印
-相关文章
  • openSUSE 11.1 Final - 正式发布
  • [视频]Opera Mini 4.2 正式版发布
  • dll注入系统进程(开源代码)
  • 认知盲区 解惑双网卡双线路DNS解析
  • FlashFXP 简体中文版 3.7.5 Build 1303 Beta[烈火]
  • -文章评论 (关闭)
    ·还没有相关的评论!

    网上大名:
    红旋风网络技术联盟 RHUTech.Union
     
    Copyright © 2000-2007 RedHyphone.Union All Rights Reserved. 红旋风联盟版权所有.皖ICP备05011033号
    中国红旋风网络技术联盟 | www.RedHyphone.net
    Mailto:Redhyphone@gamil.com