3、汇编基础
标号的值如何计算
标号的值默认等于到程序开头的距离;
可以通过指定段的vstart值,使标号的值等于到段开头的距离+vstart
$和$$的意义
$是当前行相对汇编文件开头的偏移,$$是当前section相对汇编文件开头的偏移,特殊情况是:

段地址
段地址必须是16位对齐的(可以被十进制数16整除,或地址的16进制形式末位为0
div
div bx命令,被除数的高16位存在dx,低16位存在ax;
商存在ax,余数存在dx。
nasm的org指令
org指令的作用:告诉编译器程序将要被加载到内存中的哪个地址,它为程序中所有的内部地址引用设置一个偏移值
使用org指令:mov ax,BootMessage BootMessage的值为0x7c1e

不使用org指令:mov ax,BootMessage BootMessage的值为0x1e

所以org指令为标号的原始地址0x1e加上了0x7c00
宏
在NASM汇编语言中,宏是一种用于简化代码的机制。它们允许您将一段代码定义为单个宏名,然后在需要的地方重复使用该宏。
定义宏的语法如下:
; 其中,`name`是宏的名称,`parameters`是宏的参数(如果有的话),`code`是宏的代码块。
macro name parameters { code } ; 定义一个宏,将两个数相加 macro add_macro a, b { mov eax, [a] add eax, [b] mov [a], eax } section .data num1 db 10 num2 db 20 section .text global _start _start: ; 使用宏将num1和num2相加 add_macro num1, num2 ; 退出程序 mov eax, 1 xor ebx, ebx int 0x80
宏的参数只能是编译器就可以确定的标量,不可以是标签等变量。
dw、dd和equ的区别是什么?
count1 EQU 16H ;count1是常量,编译后的程序不存在count1
count2 DW 16H ;count2是变量,编译后的程序会有一个word的变量空间属于count2,count2作为一个变量来使用,可以任意改变
常用的寄存器
段寄存器:CS(代码段)、DS(数据段)、ES(附加段)、FS(附加段)、GS(附加段)、SS(栈段)
通用寄存器:AX、BX、CX、DX、SI、DI、BP(基址指针,用于任意访问栈)、SP(栈指针,指向栈顶)

浙公网安备 33010602011771号