分享

汇编语言学习篇1——DOSBox、汇编语言、汇编器的认识

 山峰云绕 2023-03-31 发布于贵州

说明
  

https://blog.csdn.net/weixin_42645653/article/details/120363676

本文章旨在总结备份、方便以后查询,由于是个人总结,如有不对,欢迎指正;另外,内容大部分来自网络、书籍、和各类手册,如若侵权请告知,马上删帖致歉。
  QQ 群 号:513683159 【相互学习】
内容来源
  在DOS年代,人们买电脑干什么?DOSBox是什么
  什么是NASMnasm与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]

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多