as
GNU AS, Linux下编写汇编常用的编译的工具。
as汇编同时支持AT&T,Intel汇编语法。as汇编Intel汇编语法没有写过。
as汇编默认采用的是AT&T汇编语法。
链接工具
ld
参考另一篇文章:https://www.iteye.com/blog/lobin-2513941
binary
这是一种纯二进制可执行文件,和windows下的.com文件类似,其中只包含可执行执行的机器码。
可以通过这种方式生成可以在windows下执行的COM文件。
操作符
=
k_seg = 0x3000
指令
.equ
.equ symbol, expression
例子:
.equ k_seg, 0x3000
.ifdef
.ifdef hd
...
.else
...
.endif
>as --defsym floppy= boot/boot.S -o boot/boot.o
>as --defsym hd= boot/boot.S -o boot/boot.o
.ifle
.ifle k_kernel_size_in_sector - 64
...
.else
...
.endif
段
段在AS中叫Section,AS中使用.section伪指令定义段
.section name
例子:
.section .text
这里定义了一个section,名字叫.text
另外,在AS中还有子段(Sub-Section)。使用.subsection伪指令定义段
.subsection name
section stack
AS还有一个概念:section栈
除了上面的段定义方式,AS还有一种简单的段定义方式
代码段:
.text subsection
这里的subsection可省略
.text
它等同于
.text 0
数据段:
.data subsection
这里的subsection可省略
.data
它等同于
.data 0
.global symbol, .globl symbol
.global或.globl在链接的时候(通过ld将多个文件链接在一起)使符号可见。这在源程序由多个as文件组成的时候如果在一个程序文件中使用了另一个程序文件中的符号时,如调用了另一个程序文件中的的函数(过程),需要将这个函数(过程)暴露出去。
例子:
.globl _kp_mode
CFI指令
CFI(Call Frame Information)相关的指令
.cfi_sections section_list
.cfi_startproc [simple]
.cfi_endproc
AS汇编源代码
一个简单例子,函数调用
.code32 .text .global _start test: push %ebp mov %esp, %ebp pop %ebp ret _start: call test movl $0,%ebx movl $1,%eax int $0x80
.code16 .global _start .text _test: mov $message, %dx mov $0x09, %ah int $0x21 ret _start: mov %cs, %ax mov %ax, %ds call _test mov $0x4c, %ah int $0x21 message: .ascii "Hello, MASM!" .byte 0x0d, 0x0a, '$'
Linux下as汇编生成Windows COM文件
因为linux是运行在保护模式下,所以在linux下汇编是不能直接使用中断的。要想使用中断,可以在虚模式(虚拟8086模式)或者实模式(实地址模式)下。但linux是不能运行在这两种模式下的。
要想进入虚模式(虚拟8086模式)或者实模式(实地址模式),可以在Windows下命令行下进入虚模式(虚拟8086模式),或者如果是DOS的话,DOS是运行在实地址模式下的。
linux下可以通过虚拟机方式运行freedos。
以下面一个简单的例子:
.code16 .global _start .text _start: mov %cs, %ax mov %ax, %ds mov $message, %dx mov $0x09, %ah int $0x21 mov $0x4c, %ah int $0x21 message: .ascii "Hello, MASM!" .byte 0x0d, 0x0a, '$'
编译:
as --32 int21_09h_test.asm -o int21_09h_test.o
链接:
ld -Ttext 0x100 -m elf_i386 int21_09h_test.o -o int21_09h_test.elf
ld工具需要支持elf_i386(emulation)
如:
Supported emulations:
elf_i386
i386linux
可通过ld -V或ld --verbose查看支持的emulation。
# ld --verbose
GNU ld version 2.15.92.0.2 20040927
Supported emulations:
elf_i386
i386linux
# ld -V
GNU ld version 2.15.92.0.2 20040927
Supported emulations:
elf_i386
i386linux
复制:
objcopy -j .text -O binary int21_09h_test.elf int21_09h_test.com
在freedos下运行:
>.\int21_09h_test.com
Hello, MASM!
也可以拷贝到Windows下运行:在虚模式(虚拟8086模式)或者实模式(实地址模式)下。
上面的例子需要3步才能生成COM文件,中间还要生成ELF文件,并且在链接的时候指定代码段加载的位置:-Ttext 0x100。但其实只需要2步就可以。
.code16 .global _start .text _start: mov %cs, %ax mov %ax, %ds mov $message, %dx mov $0x09, %ah int $0x21 mov $0x4c, %ah int $0x21 message: .ascii "Hello, AS!" .byte 0x0d, 0x0a, '$'
编译:
>as com_test_1.asm -o com_test_1.o
复制:
>ld -Ttext 0x100 -s --oformat binary com_test_1.o -o com_test_1.com
Windows下as汇编
虽然as是linux下的汇编编译工具,但同样也可以在Windows下使用。
在windows下安装cygwin,同时安装as,ld,objcopy等必要工具。用法和linux下基本差不多。
Windows下as汇编生成COM文件
跟上面的例子一样:
.code16 .global _start .text _start: mov %cs, %ax mov %ax, %ds mov $message, %dx mov $0x09, %ah int $0x21 mov $0x4c, %ah int $0x21 message: .ascii "Hello, MASM!" .byte 0x0d, 0x0a, '$'
编译:
as --32 int21_09h_test_1.asm -o int21_09h_test_1.o
链接:
ld -Ttext 0x100 -m i386pe int21_09h_test_1.o -o int21_09h_test_1.exe
这里和上面不同的是,这里因为是在windows环境下,ld工具需要支持i386pe(emulation)
如:
Supported emulations:
i386pe
可通过ld -V或ld --verbose查看支持的emulation。
>ld --verbose
GNU ld (GNU Binutils) 2.23.52.20130309
Supported emulations:
i386pe
>ld -V
GNU ld (GNU Binutils) 2.23.52.20130309
Supported emulations:
i386pe
复制:
objcopy -j .text -O binary int21_09h_test_1.exe int21_09h_test_1.com
在上面的例子中,需要3步才能生成COM文件,中间还要生成EXE文件,并且在链接的时候指定代码段加载的位置:-Ttext 0x100。但其实只需要2步就可以。
如下例子:
.code16 .global _start .text #.org 0x100 # _start: mov %cs, %ax mov %ax, %ds mov $message + 0x100, %dx mov $0x09, %ah int $0x21 mov $0x4c, %ah int $0x21 message: .ascii "Hello, MASM!" .byte 0x0d, 0x0a, '$'
在这个例子中,需要自己维持段内偏移,所以这里在计算message的偏移位置的时候要自己加上0x100。
编译:
as int21_09h_test_2.asm -o int21_09h_test_2.o
复制:
objcopy -j .text -O binary int21_09h_test_2.o int21_09h_test_2.com
相关推荐
第1 章 使用应用安全验证标准 第2 章 评估软件达到验证水平 第3章V1:架构、设计和威胁建模 第4章V2:认证 第5章V3:会话管理 第6章V4:访问控制21 第7章V5:恶意输入处理 第8章V6:密码学安全 第9章V7:错误处理和...
第二章:能力风暴 AS-UIII 机器人简介 在当今科技日新月异的时代,机器人技术已经渗透到各个领域,教育也不例外。能力风暴 AS-UIII 机器人是一款专为教育设计的智能机器人,旨在帮助学生理解和掌握编程、机械工程...
"云计算与大数据应用开发 第一章:云计算与大数据概述" 本资源摘要信息涵盖了云计算与大数据应用开发的基础知识,包括云计算与大数据的定义、特点、应用场景、技术架构、开发工具等方面的知识点。 云计算概述 ...
首先,针对(1)统计离散数学成绩分布的问题,创建了一个名为SCC的表来存储各分数段的人数。通过插入语句初始化了表结构,然后利用存储过程计算不同分数段(>90, >80, >70, >60, )的学生人数。在这个过程中,使用了...
6. 在生成的类文件中,编写第一个Java程序的标准输出语句:`System.out.println("Hello, World!");`。 7. 运行程序,通过点击工具栏中的运行按钮或右键选择“Run As”,选择“Java Application”来运行程序。 8. ...
教程名称:《ASP动态网站制作实例教程》课件打包下载课程目录:【】《ASP动态网站制作实例教程》第1章:Web基础知识【】《ASP动态网站制作实例教程》第2章:ASP的安装、配置和运行【】《ASP动态网站制作实例教程》第...
- 变量名的第一个字符不能是数字。 - 变量名中不能包含空格;如果需要多词命名,可以使用下划线(_)代替空格。 - 变量名是区分大小写的,即`abc`和`ABC`代表不同的变量。 **示例**: ```python # 定义不同类型的...
以下是对【标题】:"PCS7深入浅出(第03章AS-OS通讯)"中提到的知识点的详细说明: 1. PCS7系统中的AS与OS通讯概述: PCS7系统通过工业以太网作为工厂总线实现自动化系统的连接。自动化站(AS)通过特定的通讯卡...
### 高级Java人才培训专家-第六章:数仓主题指标层建设 #### 数仓主题指标层建设概览 在本章节中,我们将深入探讨如何构建一个高效且实用的数仓(Data Warehouse)主题指标层。数仓是企业用于数据分析的重要基础...
**深度学习框架TensorFlow基础教程——第7章:TensorFlow初试(线性回归)** 在本章节中,我们将深入探讨TensorFlow这一强大的深度学习框架,并通过实例介绍如何使用它来实现一个简单的线性回归模型。线性回归是机器...
#### 第1章:硬件构成 ##### 1.1 概要 AS3211是基于IBM PC/AT架构的AT兼容单板计算机。该板载有CPU、多种I/O接口、SVGA、Flash-Disk以及Watch Dog Timer等组件,并预先安装了4MB系统内存。这使得AS3211成为一款集成...
**一、TensorFlow简介** TensorFlow以其灵活的计算图模型和高效的执行引擎,允许开发者构建和部署各种规模的机器学习模型。它支持分布式计算,可以在CPU和GPU上运行,并且提供了丰富的API用于数据预处理、模型构建...
本章我们将深入探讨TensorFlow中的“变量”和“矩阵”这两个关键概念。 首先,我们要理解“变量”在TensorFlow中的作用。在数学上,变量是表示可变值的概念,而在TensorFlow中,变量是一种持久化的数据结构,它们...
《Python核心编程》第十一章深入探讨了函数和函数式编程的概念,这在第二章的基础之上进行了扩展。在Python中,函数不仅仅是一个简单的代码块,它们具有丰富的特性和功能,如多样的调用方式、参数类型和函数式编程...
第1章:TensorFlow简介 TensorFlow是一个开源的机器学习框架,由Google Brain团队开发。它广泛用于数据挖掘、机器学习研究以及生产中的机器学习应用。 第2章:环境搭建 安装TensorFlow 你可以通过Python的包管理...
第1章:Visual Basic .NET 简介 Visual Basic .NET(简称VB.NET)是.NET框架的一部分,是一种面向对象的编程语言,常用于Windows应用程序和Web应用程序的开发。 第2章:环境搭建 安装Visual Studio 访问Visual ...