汇编语言部分语法记录

db、dw、dd、dq解释

DB定义字节类型变量,一个字节数据占1个字节单元,读完一个,偏移量加1

DW定义字类型变量,一个字数据占2个字节单元,读完一个,偏移量加2

DD定义双字类型变量,一个双字数据占4个字节单元,读完一个,偏移量加4

DQ定义四字类型变量,一个四字数据占8个字节单元,读完一个,偏移量加8

lgdt fword ptr gdt_descr

org

org是汇编器的伪指令,是告诉编译器下一条汇编语句的偏移地址

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
;/*
; * Linus 将内核的内存页表直接放在页目录之后,使用了4 个表来寻址16 Mb 的物理内存。
; * 如果你有多于16 Mb 的内存,就需要在这里进行扩充修改。
; */
;// 每个页表长为4 Kb 字节,而每个页表项需要4 个字节,因此一个页表共可以存放1000 个,
;// 表项如果一个表项寻址4 Kb 的地址空间,则一个页表就可以寻址4 Mb 的物理内存。页表项
;// 的格式为:项的前0-11 位存放一些标志,如是否在内存中(P 位0)、读写许可(R/W 位1)、
;// 普通用户还是超级用户使用(U/S 位2)、是否修改过(是否脏了)(D 位6)等;表项的位12-31
;// 是页框地址,用于指出一页内存的物理起始地址。
org 1000h ;// 从偏移0x1000 处开始是第1 个页表(偏移0 开始处将存放页表目录)。
pg0:

org 2000h
pg1:

org 3000h
pg2:

org 4000h
pg3:

org 5000h ;// 定义下面的内存数据块从偏移0x5000 处开始。

lss

总体描述:
用32位或48位或64位的数据加载16位SS段选择符和16或32位或64位的通用寄存器值,其中通用寄存器在目的操作数中。
LSS (16or32or64)通用寄存器, (32or48or64)内存变量的地址

lea

LEA指令的功能是将源操作数、即存储单元的有效地址(偏移地址)传送到目的操作数。

LEA有两个操作数:

1、左边是目的操作数,表示操作结果保存在此,该指令目的操作数只能是8个通用寄存器之一。

2、右边的是源操作数,该指令的源操作数只能是一个存储单元,表达存储单元有多种寻址方式。

DQ 256 dup(0) ;// idt is uninitialized // 256 项,每项8 字节,填0。

定义了256个4字0,即256*8个字节0

LMSW、SMSW

SMSW: Store Machine Status Word
取处理器状态字,即CR0寄存器的第0到15位。没有记错的话操作数可以是16位通用寄存器或者内存地址。

LMSW: Load Machine Status Word
置处理器状态字。但是只有操作数的低4位被存入CR0,只有PE,MP,EM和TS被改写,CR0其他位不受影响。

IRET/IRETD - 中断返回

iretd

当一个中断服务程序执行完毕时,CPU将恢复被中断的现场,返回到引起中断的程序中。为了实现此项功能,指令系统提供了一条专用的中断返回指令。

该指令执行的过程基本上是INT指令的逆过程,具体如下:
◆、从栈顶弹出内容送入IP;
◆、再从新栈顶弹出内容送入CS;
◆、再从新栈顶弹出内容送入标志寄存器;
对80386及其以后的CPU,指令IRETD从栈顶弹出32位内容送入EIP。
中断和子程序调用之间有其相似和不同之处。它们的工作过程非常相似,即:暂停当前程序的执行,转而执行另一程序段,当该程序段执行完时,CPU都自动恢复原程序的执行。

它们的主要差异有:
◆、子程序调用一定是程序员在编写源程序时事先安排好的,是可知的,而中断是由中断源根据自身的需要产生的,是不可预见的(用指令INT引起的中断除外);
◆、子程序调用是用CALL指令来实现的,但没有调用中断的指令,只有发出中断请求的事件(指令INT是发出内部中断信号,而不要理解为调用中断服务程序);
◆、子程序的返回指令是RET,而中断服务程序的返回指令是IRET/IRETD。
◆、在通常情况下,子程序是由应用系统的开发者编写的,而中断服务程序是由系统软件设计者编写的。

int