汇编基础-13

汇编基础-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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
.data

test1 DWORD 100
address DWORD $

.code
main PROC
mov eax, 0
lea eax, test1
mov eax, 0
mov eax, address
mov eax, 0
mov eax, OFFSET test1
mov eax, 0

main endp

我们发现它一定程度上和offset指令和$符效果相同,不过这两个是masm独有的符号,在别的架构里说不定就没有了

当然,在涉及堆栈时,就需要它来运行时计算,详细参考汇编基础6

LOOP指令补充

1
2
3
4
5
6
7
8
9
10
11
12
13
循环指令:LOOP   OPR
测试条件:(CX) != 0

为零或相等时循环指令:LOOPZ(LOOPE) OPR
测试条件:ZF=1 且 (CX) != 0

不为零或不相等时循环指令:LOOPNZ(LOOPNE) OPR
测试条件:ZF=0 且 (CX) != 0
如:
loop again
等价于:
dec ecx
jnz again

11.23更新

伪操作

伪操作是汇编程序对源程序进行汇编时处理的操作,完成处理器的选择存储模式的定义数据定义存储器分配指示程序开始和结束等功能

处理器选择

伪指令 含义
.8086 选择8086指令系统
.286 选择80286指令系统
.286P 选择保护模式下的80286指令系统
.386 选择80386指令系统
.386P 选择保护模式下的80386指令系统
….. …..

段定义伪操作

1
2
3
4
段名 SEGMENT [定位类型][组合类型][使用类型][类别]
....
....
段名 ENDS
  • 定位方式默认为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
2
    ORG 100H
START: ......

汇编语言源程序中若没有ORG伪指令,则程序执行时,指令代码被放到自由内存空间的CS:0处;若有ORG伪指令,编译器则把其后的指令代码放到ORG伪指令指定的偏移地址。两个ORG伪指令之间,除了指令代码,若有自由空间,则用0填充。

基数控制伪操作

.RADIX 表达式
用于规定以下的无标记数的默认基数,如果不设置默认为10

1
2
3
4
5
6
7
.RADIX
mov bx, 0FF
mov bx, 178
;等价写法

mov bx, 0FFH
mov bx, 178H
Author

Ctwo

Posted on

2019-11-14

Updated on

2020-10-25

Licensed under

Comments