Skip to main content

Posts

Showing posts with the label asm

[转]AT&T汇编语言与GCC内嵌汇编简介

AT&T汇编语言与GCC内嵌汇编简介 版本 0.1 时间04/3/30 EMAIL chforest_chang@hotmail.com 1 AT&T 与INTEL的汇编语言语法的区别 1.1大小写 1.2操作数赋值方向 1.3前缀 1.4间接寻址语法 1.5后缀 1.6指令 2 GCC内嵌汇编 2.1简介 2.2内嵌汇编举例 2.3语法 2.3.1汇编语句模板 2.3.2输出部分 2.3.3输入部分 2.3.4限制字符 2.3.5破坏描述部分 2.4GCC如何编译内嵌汇编代码 3后记 本节先介绍 AT&T汇编语言语法与INTEL汇编语法的差别,然后介绍GCC内嵌汇编语法。阅读本节需要读者具有INTEL 汇编语言基础。 1 AT&T 与INTEL的汇编语言语法的区别 1.1 指令大小写 INTEL格式的指令使用大写字母,而AT&T 格式的使用小写字母。 例: INTEL AT&T MOV EAX,EBX movl %ebx,%eax 1.2 指令操作数赋值方向 在INTEL语法中,第一个表示目的操作数,第二个表示源操作数,赋值方向从右向左。 AT&T语法第一个为源操作数,第二个为目的操作数,方向从左到右,合乎自然。 例: INTEL AT&T MOV EAX,EBX movl %ebx,%eax 1.3 指令前缀 在INTEL语法中寄存器和立即数不需要前缀; AT&T中寄存器需要加前缀“%”;立即数需要加前缀“$”。 例: INTEL AT&T MOV EAX,1 movl $1,%eax 符号常数直接引用,不需要加前缀,如: movl value , %ebx value为一常数; 在符号前加前缀 $, 表示引用符号地址, 如 movl $value, %ebx 是将value的地址放到ebx中。 总线锁定前缀“lock”: 总线锁定操作。“lock”前缀在Linux 核心代码中使用很多,特别是SMP 代码中。当总线锁定后其它CPU 不能存取锁定地址处的内存单元。 远程跳转指令和子过程调用指令的操作码使用前缀“l“,分别为ljmp,lcall, 与之相应的返回指令伪lret。 例: INTEL AT&T lcall $secion:$offs...

[转] nasm 中文手册

-------------------------------------------------------------------------------- 第一章: 简介 ----------------------- 1.1 什么是NASM NASM是一个为可移植性与模块化而设计的一个80x86的汇编器。它支持相当多 的目标文件格式,包括Linux和NetBSD/FreeBSD,a.out,ELF,COFF,微软16 位的OBJ和Win32。它还可以输出纯二进制文件。它的语法设计得相当的简 洁易懂,和Intel语法相似但更简单。它支持Pentium,P6,MMX,3DNow!, SSE and SSE2指令集, 1.1.1 为什么还需要一个汇编器? NASM当初被设计出来的想法是comp.lang.asm.x86(或者可能是alt.lang.asm ,我忘了),从本质上讲,是因为没有一个好的免费的x86系例的汇编器可以使用, 所以,必须有人来写一个。 (*)a86不错,但不是免费的,而且你不可能得到32位代码编写的功能,除非你 付费,它只使用在dos上。 (*) gas是免费的,而且在dos下和unix下都可以使用,但是它是作为gcc的一 个后台而设计的,并不是很好,gcc一直就提供给它绝对正确的代码,所以它的 错误检测功能相当弱,还有就是对于任何一个想真正利用它写点东西的人来讲, 它的语法简直太可怕了,并且你无法在里面写正确的16位代码。 (*) as86是专门为Minix和Linux设计的,但看上去并没有很多文档可以参考。 (*) MASM不是很好,并且相当贵,还且只能运行在DOS下。 (*) TASM好一些,但却极入与MASM保持兼容,这就意味着无数的伪操作码和繁琐 的约定,并且它的语法本质上就是MASM的,伴随着的就是一些自相矛盾和奇怪的 东西。它也是相当贵的,并且只能运行在DOS下。 所以,只有NASM才能使您愉悦得编程。目前,它仍在原型设计阶段-我们不期望它 能够超越所有的这些汇编器。但请您发给我们...