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(栈指针,指向栈顶)

posted @ 2023-07-23 16:11  跳跳龙骑士  阅读(57)  评论(0)    收藏  举报