汇编基础-13
对之前学过的内容的补充(结合专业课)
11.14更新
关于NASM和MASM
NASM全称The Netwide Assembler,是一款基于80x86和x86-64平台的汇编语言编译程序,其设计初衷是为了实现编译器程序跨平台和模块化的特性。NASM支持大量的文件格式,包括Linux,*BSD,a.out,ELF,COFF,Mach−O,Microsoft 16−bit OBJ,Win32以及Win64,同时也支持简单的二进制文件生成。它的语法被设计的简单易懂,相较Intel的语法更为简单,支持目前已知的所有x86架构之上的扩展语法,同时也拥有对宏命令的良好支持。
摘自百度百科
宏汇编程序(MASM)是具有宏加工功能的汇编程序。可以用它定义含参数的程序段,在使用的位置上调用它们,汇编时将进行宏(指令)展开,把宏定义所预先定义的指令目标代码插在该位置上。
前面的学习都用到的是MASM,而学校实验用的是NASM,什么DOSBOX,DEBUG,用着非常的不舒服
但是这不影响对于一些共性的东西的学习,写这篇博客的存在意义就是补充这些我遗漏的东西
跨段前缀寻址
- 对于常规的寻址方式,我们都知道我们汇编的所谓地址就是一个偏移量,是相对于隐含段DS(数据段)的偏移量,对于正常的mov语句,如
mov ax, [bx]
,其实为mov ax, ds:[bx]
- 物理地址 PA = 16 * DS + 偏移量
in&out
IN AL,21H ;表示从21H端口读取一字节数据到AL
OUT 21H,AL ;将AL的值写入21H端口
lea
lea(Load effective address)表示取有效地址,也就是取偏移地址,看下面一段程序就足以说明它的含义
1 | .data |
我们发现它一定程度上和offset指令和$符效果相同,不过这两个是masm独有的符号,在别的架构里说不定就没有了
当然,在涉及堆栈时,就需要它来运行时计算,详细参考汇编基础6
LOOP指令补充
1 | 循环指令:LOOP OPR |
11.23更新
伪操作
伪操作是汇编程序对源程序进行汇编时处理的操作,完成处理器的选择,存储模式的定义,数据定义,存储器分配,指示程序开始和结束等功能
处理器选择
伪指令 | 含义 |
---|---|
.8086 | 选择8086指令系统 |
.286 | 选择80286指令系统 |
.286P | 选择保护模式下的80286指令系统 |
.386 | 选择80386指令系统 |
.386P | 选择保护模式下的80386指令系统 |
… | … |
段定义伪操作
1 | 段名 SEGMENT [定位类型][组合类型][使用类型][类别] |
- 定位方式默认为PARA,表示本段必须从能被16整除的地址开始存放,除此之外还有WORD,BYTE,PAGE
- 组合方式决定在连接时是否合并同名段,如STACK将不同模块的同名段组合成一个堆栈段,默认为PRIVATE,表示连接时不组合
- USE使用类型,USE16/32 表示用用16或32位寻址方式
- 当然这些可以被简化,就是我们常用的.data,.code等
MODEL伪操作指定存储模式
1 | .MODEL 存储模式 [,语言类型][,操作系统类型][,堆栈选项] |
- 我们常用的flat就是存储模式,除此之外还有TINY,SMALL,LARGE,HUGE等
ORG伪操作
ORG是Origin的缩写,表示起始地址或源。在汇编语言源程序的开始通常都用一条ORG伪指令来实现规定程序的起始地址。如果不用ORG规定则汇编得到的目标程序将从0000H开始。如下:
1 | ORG 100H |
汇编语言源程序中若没有ORG伪指令,则程序执行时,指令代码被放到自由内存空间的CS:0处;若有ORG伪指令,编译器则把其后的指令代码放到ORG伪指令指定的偏移地址。两个ORG伪指令之间,除了指令代码,若有自由空间,则用0填充。
基数控制伪操作
.RADIX 表达式
用于规定以下的无标记数的默认基数,如果不设置默认为10
1 | .RADIX |