本教程按照作者亲身经历和《x86汇编语言:从实模式到保护模式》写成
为什么要学汇编? 众所周知,汇编是比较早期的一种编程语言和低级语言,虽然比不上高级语言的可读性和效率,但这种语言作为最接近机器码的语言可以很好的帮助我们了解最底层相关机制。
相当于汇编到二进制机器码的编译器,NASM全称The Netwide Assembler,是一款基于80x86和x86-64平台的汇编语言编译程序 在下载连接里一直下滑到最下面,点开适合的操作系统下安装
调试环境,安装见地址教程在附录里有
相当于命令行调试下载地址
把编译出的.bin文件写入到disk硬盘里让系统运行,这里采用书中的配套工具,下载见文末
MOV指令是数据传送指令 如
mov ax,10把10这个立即数赋值给ax,相当于ax=10; 或
mov ax,bx把bx里16位数据赋值给ax,相当于ax=bx; 参考文章
JMP是汇编语言中的无条件跳转指令。无条件跳转指令可转到内存中任何程序段。转移地址可在指令中给出,也可以在寄存器中给出,或在储存器中指出,相当于goto差不多,如
infi: jmp near infi为无限循环,参考文章
这个是汇编中的除法指令,被除数默认放在AX或DX和AX,如果除数为8位,被除数则为16位,默认在AX中存放;如果除数 为16位,被除数则为32位,在DX和AX中存放,DX存放高16位,AX存放低16位。 在结果中:如果除数为8位,则AL存储除法操作的商,AH存储除法操作的余数;如果除数为16位,则AX存储除法操作的商,DX存储除法操作的余数。 一般格式为
mov ax,10 mov bx,5 div bx参考文章
add是汇编中的加法指令,大概格式为
add a,b把a和b的数据相加存到a里,a为任一通用寄存器或存储器操作数,可以是任意一个通用寄存器,而且还可以是任意一个存储器操作数,b为立即数,也可以是任意一个通用寄存器操作数.立即数只能用于源操作数b,a和b均为寄存器是允许的,一个为寄存器而另一个为存储器也是允许的, 但不允许两个都是存储器操作数。 如
add ax,10h把十六进制数10h加到ax里
汇编语言中的AX、BX、CX、DX是CPU内部的通用寄存器中的数据寄存器助记符。相当于4个16位二进制的变量,其中的高8位用AH、BH、CH、DH表示,低8位用AL、BL、CL、DL表示。参考文章
偏移地址一般和段地址一起用,应用如下
mov ax,0xb800 mov es,ax mov byte [es:0x00],'H' mov byte [es:0x01],0x07其中,es是上面从ax赋值的段地址,0x00和0x01是偏移地址,这段代码在屏幕上输出H
在上面的jmp示例代码中,"infi"为标号,相当于goto的标号,代表这里的物理内存地址
在上面的偏移地址的示例中,byte为数据类型,为8 位无符号整数,B 代表字节 参考文章
蓝奏云密码:3yp4 包含以上提到的教程
-END-