前言

汇编语言不学总感觉差点东西,那就开整,我用的是王爽老师那本汇编语言第三版,也可以看B站上“零点Boy”老师的视频课程,参考的也是王爽老师那本汇编语言讲的

电子版:这里

本文只是简单记录下这段时间的学习感受

总结

汇编语言是和操作系统强相关的低级语言,DOS下16位汇编、Windows下32位汇编、Linux下汇编可以说是“三门语言”,不像C、C++、JAVA这种高级语言,是跨平台的。王爽老师那本汇编语言讲的就是DOS下16位汇编,现在到处都是64的Windows,16位的DOS汇编属实有点过时了,但是知识都是一点点演化的,想了解汇编是怎么来的,这本书的基础部分我觉得还是有用的

16位DOS汇编寄存器是16位的,但寻址总线是20位的,所以CPU内部会有一个转换器,转换器的基本逻辑是,将两个16位寄存器(也就是两个16位二进制)经过转换变成一个20位二进制,寻址方式是 段地址:偏移地址

汇编代码之所以看起来像天书,就是因为它有很多隐藏知识,例如下述代码,ds寄存器默认被用来存放段地址,再结合偏移地址,便得到了某个字符串的起始地址,然后对字符串进行异或操作,便可以将大写变为小写,将小写变为大写(注意:32位CPU的通用寄存器变为:EAX、EBX、ECX、EDX,64位CPU的通用寄存器变为:RAX、RBX、RCX、RDX)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
assume cs:code, ds:data
data segment
db "BASIC"
db "minix"

code segment
start: mov ax, data
mov ds, ax

mov bx, 0
mov cx, 5
s1:mov al, [bx]
and al, 11011111b ; convert to upper-case
mov [bx], al
inc bx
loop s1

mov bx, 5
mov cx, 5
s2:mov al, [bx]
or al, 00100000b ; convert to lower-case
mov [bx], al
inc bx
loop s2

mov ax, 4c000h
int 21h
code ends
end start

01

16位DOS汇编中用到的主要寄存器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
AX:通用寄存器,通常用于存放程序运行过程中产生的临时值,可以简易理解为C语言中的变量

BX:通用寄存器,除了存放临时值,常结合SI、DI存放内存地址

CX:通用寄存器,除了存放临时值,还用作循环计数器

DX:通用寄存器,通常用于存放程序运行过程中产生的临时值,可以简易理解为C语言中的变量

CS:Code Segment,代码段寄存器,里面存放要执行的指令的段地址

IP:Instruction Pointer,指令指针寄存器,里面存放要执行指令的偏移地址

DS:Data Segment,数据段寄存器,里面存放要访问的数据的段地址

SS:Stack Segment,栈段寄存器,里面存放栈的段地址

SP:Stack Pointer,栈指针寄存器,里面存放栈的偏移地址

ES:Extra Segment,附加段寄存器

SI:Source Index,源变址寄存器,里面存放可变的内存地址

DI:Destination Index,目的变址寄存器,里面存放可变的内存地址