汇编语言学习篇1——DOSBox、汇编语言、汇编器的认识
内容来源: 在DOS年代,人们买电脑干什么? DOSBox是什么 什么是NASM nasm与masm编译器的优劣DOSBox简介 DOSBox 是一个x86 DOS 模拟程序,采用的是 SDL 库,故方便移植。 作用:运行现代计算机不能运行的MS-DOS软件。 DOS = Disk Operation System = 磁盘操作系统 ,即:一个基于磁盘管理的操作系统。 1.
说明:
本文章旨在总结备份、方便以后查询,由于是个人总结,如有不对,欢迎指正;另外,内容大部分来自网络、书籍、和各类手册,如若侵权请告知,马上删帖致歉。
QQ 群 号:513683159 【相互学习】
内容来源:
在DOS年代,人们买电脑干什么?、DOSBox是什么
什么是NASM、nasm与masm编译器的优劣、什么是MASM?
(转)gas汇编小手册 学习Linux内核代码的必备、GNU Binutils 介绍
Linux 汇编语言开发指南
上下文链接
下一篇:汇编语言学习篇2——MASM的环境搭建(win10与Ubuntu1604下的配置)
DOSBox简介
DOSBox 是一个x86 DOS 模拟程序,采用的是 SDL 库,故方便移植。
作用:运行现代计算机不能运行的MS-DOS软件。
DOS = Disk Operation System = 磁盘操作系统 ,即:一个基于磁盘管理的操作系统。
1.以命令行的形式,靠输入命令进行人机交互。(也有很多软件:游戏、办公软件、财务软件等)
2.基本功能:执行命令和程序功能、I/O管理功能、磁盘与文件管理。
3.由微软开发,在微软后续发布的计算机操作系统中,磁盘系统一直被保留着。(微软图形界面操作系统Windows NT问世以来,DOS以后台程序的形式出现。名为Windows命令提示符【运行(Win+R)——》CMD】)
汇编语言(符号语言)
简介:
一种面向机器的程序设计语言(低级编程语言),用助记符代替机器指令的操作码,用地址符号或标号代替指令或操作数的地址。
特定的汇编语言和特定的机器语言指令集是一一对应的,即:不同设备的汇编语言对应不同的机器语言指令集,不同平台之间不可直接移植。
优缺点:
优点:
1.能直接访问与硬件相关的存储器或 I/O 端口;
2.能不受编译器的限制,对生成的二进制代码进行完全的控制;
3.能对关键代码进行更准确的控制,避免因线程共同访问或者硬件设备共享引起的死锁;
4.能根据特定的应用对代码做最佳的优化,提高运行速度;
5.能最大限度地发挥硬件的功能。
缺点:
1.编写的代码非常难懂,不好维护;
2.很容易产生 bug,难于调试;
3.只能针对特定的体系结构和处理器进行优化;
4.开发效率很低,时间长且单调
汇编器(GAS、MASM、NASM)
分类:
不同风格的汇编语言格式会有不同,并需对应的汇编器进行汇编,比较流行的汇编语言有3种:
1.AT&T风格的汇编语言:(特点是寄存器前面有%号)
GAS汇编器 - GNU Assembler - GNU汇编器 - GAS官网链接
GAS属于GCC的一部分。无需单独安装,可使用指令as --version
检查GAS的存在。
2.Windows风格的汇编语言:
MASM汇编器 - Microsoft Macro Assembler -Microsoft宏汇编程序 - MASM官网链接
3.NASM风格的汇编语言:
NASM汇编器 - Netwide Assembler -基于x86架构的汇编与反汇编软件 - NASM官网链接
编写16位(8086、80286等)、32位(IA-32)和64位(x86_64)的程序。【支持x86与x64架构的CPU(注意不支持ARM架构)。】
GAS | MASM | NASM | |
---|---|---|---|
平台 | Linux | DOS/Windows | Windows/Unix/ Linux/Mac OSX |
语法风格 | AT&T | Intel | Intel |
软件类型 | 自由软件 | 微软开发 | 开源工具 |
Linux 汇编工具 (GAS与NASM)
GAS | NASM | |
---|---|---|
汇编器 (assembler) | GCC 所依赖的后台汇编工具, 包含在 binutils 软件包, as hello.s -o hello.o | 提供了很好的宏指令功能, 支持相当多的目标代码格式, 执行速度快于GAS (人工编写的语法分析器), nasm -f elf hello.asm |
链接器 (linker) | 链接程序ld,包含于binutils 软件包 ld -s hello.o -o hello | |
调试器 (debugger) | GDB、DDD、ALD(Assembly Language Debugger) as --gstabs -o hello.o hello.s ld -o hello hello.o | |
AT&T与Intel语法的区别
区别 | AT&T | Intel |
---|---|---|
使用寄存器 | 加前缀%:pushl %eax | 无前缀:push eax |
使用立即数 | 加前缀$:pushl $1 | 无前缀:push 1 |
源操作数与目标操作数相反 | addl $1, %eax:eax寄存器+1 操作符 源操作数 目标操作数 | add eax, 1 :eax寄存器+1 操作符 目标操作数 源操作数 |
操作数的字长 | 由操作符的最后一个字母决定, 'b' =byte-字节-8 比特、 'w'-word-字-16比特、 'l'-long-长字-32比特, 如:movb val, %al | 由操作数的前缀决定, "byte ptr"-8 比特 "word ptr-16 比特 "long ptr-32 比特 如:mov al, byte ptr val |
绝对转移 调用指令 返回指令 | 加前缀*: ljump $section, $offset lcall $section, $offset lret $stack_adjust | 无前缀 jmp far section:offset call far section:offset ret far stack_adjust |
内存操作数的寻址方式 | section:disp(base, index, scale) | section:[base + index*scale + disp] |
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)