X86汇编语言学习(一)基础知识与MBR分区
# 基础知识
1 字(Word)=2 字节(Byte)=16 比特(bit)
# 寄存器
# 8086 16 通用位寄存器
可分成 8 位独立寄存器
- AX - AH,AL (累加器)
- BX - BH,BL (基址寄存器)
- CX - CH,CL (计数器)
- DX - DH,DL (数据寄存器)
可以用来提供偏移地址
- SI (源索引寄存器)
- DI (目标索引寄存器)
- BX
- BP
intel 80x86 只允许基址寄存器bx
,bp
与变值寄存器si
,di
组合
# 现代电脑寄存器
# 标志寄存器 FLAGS
标志位 | 标志位名称/外语全称 | =1 | =0 |
---|---|---|---|
CF | 进位标志/Carry Flag (无符号数) | 最高位进位,借位 | 无进位 |
PF | 奇偶标志/Parity Flag | 偶数个 1 | 奇 |
AF | 辅助进位标志/Auxiliary Carry Flag | 进位 | 无进位 |
ZF | 零标志/Zero Flag | 等于零 | 不等于零 |
SF | 符号标志/Sign Flag | 负数 | 非负 |
TF | 跟踪标志/Trace Flag | ||
IF | 中断标志/Interrupt Flag | 允许 | 禁止 |
DF | 方向标志/Direction Flag | 减少 | 增加 |
OF | 溢出标志/Overflow Flag (有符号数) | 溢出 | 未溢出 |
# 语法
** 续行符** \
可以用二进制的方式表示立即数,nasm 支持在每个 bit 之间添加_
分隔符
# 数字
有符号数高位为 0 正,为 1 是负
16 位有符号数 -32768~32767
8 位有符号数 -128~127
# neg 指令
用 0 减去操作数
# 8 位,16 位有符号数扩展
- cbw(0x98) AL 扩展到 AX
- cwd(0x99) AX 扩展到 DX:AX
# 数据传送
# Mov
# 批量数据传送
movsb 以字节为单位 movsw 以字为单位
- DS:SI 原始段地址:偏移地址
- ES:DI 目标段地址:偏移地址
- CX 传送字节/字数
FLAGS 第 10 位方向标志DF
控制传送方向
cld
方向标志清零(正向(从低地址到高地址))
std
方向标志置位(反向)
# 标号
flag : jump near flag
1
# 声明数据
- db 声明字节
- dd 声明字
- dd 声明双字
- dq 声明四字 标号代表该指令的汇编地址
# 运算
# inc 和 dec
- inc 寄存器或字内存单元加一
- dec 减一
# add,sub 指令
源操作数可以为内存单元,通用寄存器,立即数
# div,idiv 指令
种类 | 被除数地址 | 商 | 余数 |
---|---|---|---|
16 位除 8 位 | AX | AL | AH |
32 位除 16 位 | 高 16 在 DX,低 16 在 AX | AX | DX |
# 逻辑运算指令
and
, or
xor
指令
被运算数和运算数要是相同宽度的通用寄存器或内存单元,运算结果放到被运算数中
# 跳转
# jmp 指令
jmp 指令可使用绝对地址和标号 执行时,指令指针寄存器 IP 加上操作数再加操作长度,得到了实际偏移地址
# 条件转移指令
jcc 指令族
jcxz
指令,若 cx 为零跳转
# cmp 指令
cmp 被测量对象 基准
1
2
3
2
3
根据计算结果影响标志位
# 循环
# loop 指令
0xE2 操作数
1
2
3
2
3
重复一段代码,每次执行CX
减一,不为零跳到制定位置
# 文字显示
文本模式 显存物理起始地址 : 0xB8000
每个显示字符对应两个字节
- 字符 ASCII 码
- 控制字符 控制字符格式: |K|R|G|B|I|R|G|B| (高位背景色,低位前景色)
1
上次更新: 2021/10/26, 17:07:02