第2天:继续开发
汇编语言讲解
-
ORG:ORG 0x7c00 指明程序在内存中的装载地址,把下面的程序装载到内存的这个地址。有了这个符号,$符号的意义也就变了,代表将要读入的内存地址。
-
JMP:相当于C语言的goto语句,跳转。JMP entry 意为跳转到标号entry代表的地址继续执行。
-
MOV: move,其实相当于赋值语句。MOV AX,0 相当于AX=0;MOV SS,AX相当于SS=AX。但MOV有一个规则:源数据和目的数据必须位数相同。
-
[]、BYTE、WORD、DWORD **BYTE表示保存1字节信息,WORD表示保存2字节信息,DWORD表示保存4字节信息。MOV BYTE [678],123 意为要用内存的678号地址来保存数字123,保存1个字节的信息(因为前面有BYTE)。[]是取地址运算符,可以理解为把123保存到地址678代表的内存单元。**同理MOV WORD [678],123意为保存123到地址678单元和它附近的679单元(合计两个字节的存储单元)。
-
数据大小 [地址] 如上面的BYTE [678]。指定数据大小来存储数据。如果指定大小比1字节大,就向地址增大的方向选取更多数据单元来存储数据。地址可以是确定的数字,也可以是变量。注意,下文的AX、CX、DX、SP不能用在这里指定内存地址,因为CPU没有能够处理这四种指令的电路。其他四个可以。
-
ADD SI,1 意为SI=SI+1
-
CMP 比较指令。 CMP AL,0 意为将AL中的值与0相比较,如果比较结果相等,就跳转到指定地址,如果结果不等,就不跳转,继续执行下一条指令。
-
JE 条件跳转指令之一,根据比较结果决定跳转或不跳转。JE来源于"jump if equal".
CMP AL,0
JE fin
两指令相当于 if (AL == 0) { goto fin; }.fin是个标号,和上文的entry等一个类型。
-
INT 软件中断指令
-
HLT 让CPU处于待机状态
寄存器
CPU中有存放数据的寄存器,容量小但是速度快。有代表性的有以下一些。
- AX——accumulator 累加寄存器
- CX——counter 计数寄存器
- DX——data 数据寄存器
- BX——base 基址寄存器
- SP——stack pointer 栈指针寄存器
- BP——base pointer 基址指针寄存器
- SI——source index 源变址寄存器
- DI——destination index 目的变址寄存器
注意,汇编语言中所有的标号(如entry,msg等)都是数字地址,是根据ORG计算得到的确定的地址值。
Makefile入门
Makefile是一个用于编译链接的方式,用一个Makefile文件控制。
在目录下新建一个Makefile文件,用记事本编辑该文件,写入文件生成规则,接下来调用make命令会直接按文件要求进行编译连接和更新。
让我们先来粗略地看一看makefile的规则。
target ... : prerequisites ...
command
...
...
-
target
可以是一个object file(目标文件),也可以是一个执行文件,还可以是一个标签(label)。
-
prerequisites
生成该target所依赖的文件和/或target
-
command
该target要执行的命令(任意的shell命令)
如下例
#文件生成规则
ipl.bin : ipl.nas Makefile
../z_tools/nask.exe ipl.nas ipl.bin ipl.lst
helloos.img : ipl.bin Makefile
../z_tools/edimg.exe imgin:../z_tools/fdimg0at.tek \
wbinimg src:ipl.bin len:512 from:0 to:0 imgout:helloos.img
如果在Makefile文件中增加如下内容,则每次输入make img就相当于输入了make -r helloos.img
#命令
img :
../z_tools/make.exe -r helloos.img