x86汇编语言:从实模式到保护模式笔记(二)

1.我们都知道,8086可以访问1MB内存,其中,0xF0000~9FFFF属于常规内存,由内存条提供;0xF0000~0xFFFFF由主板上的一个芯片提供,即ROM-BIOS。这样一来,中间还有一个320KB的空间,即0xA0000~0xEFFFF。传统上,这段地址空间由特定的外围设备来提供,其中就包括显卡。因为显示功能对于现代计算机来说实在太重要了。

2.由于历史原因,所有在个人计算机上使用的显卡,在加电自检之后都会把自己初始化到80*25的文本格式。在这种模式下,屏幕上可以显示25行,每行80个字符(一个字符两个字节组成。每屏总共2000个字符(4000字节)。

3.一直以来,0xB8000~0xBFFFF这段物理地址空间,是留给显卡的。

tip:不允许将立即数传送到段寄存器。

4.屏幕上的每个字节对应着显存中的两个连续字节,前一个是字符的ASCLL代码,后面是字符的显示属性,包括字符颜色(前景色)和底色(背景色)。字符的显示属性(1字节)分为两部分,低4位定义的是前景色,高4位定义的是背景色。格式:K R G B + I R B G(K是闪烁位,为0时不闪烁,为1时闪烁;I是亮度位,为0时正常,为1时高亮)

RGB:(000黑;001蓝;010绿;011青;100红;101品红;110棕;111白)

tip:mov指令的目的操作数不允许为立即数,而且,目的操作数和源操作数不允许同时为内存单元。

5.在源程序的编译阶段,编译器会把源程序整体上作为一个独立的段来处理,并从0开始计算和跟踪每一条指令的地址。因为该地址是在编译期间计算的,故称汇编地址。汇编地址是在源程序编译期间,编译器为每条指令确定的汇编位置,指示该指令相对于程序或者段起始处的距离,以字节计。当编译后的程序装入物理内存后,它又是该指令在内存段内的偏移地址。

6.在NASM汇编语言中,每条指令的前面都可以拥有一个标号,以代表和指示指令所在的汇编地址。

例如:

0x0000012B              infi: jmp near infi

在这里,行首带冒号的标号是“infi”。这条指令的汇编地址是0x0000012B,故infi就代表数值0x0000012B。或者说是0x0000012B的符号化表示。

7.在程序中声明并初始化数据:要放在程序中的数据使用DB指令来声明的(Declare)的,DB的意思是声明字节(Declare Byte),所以,跟在它后面操作数都占一个字节的长度。注意,如果声明超过一个以上的数据,各个操作数之间必须以逗号隔开。

除此之外,DW(Declare Word)用于声明字数据,DD(Declare Double Word)用于声明双字数据,DQ(Declare Quad Word)用于声明四字数据。DB,DW,DD和DQ并不是处理器指令而是汇编指令(伪指令)。

8.8086处理器提供除法指令div,它可以做两种类型的除法。

第一种:是用16位的二进制数除以8位的二进制数。在这种情况下,被除数必须在寄存器AX中,必须事先传送到AX寄存器里。除法可以由8位的通用寄存器或者内存单元提供。指令执行后,商在寄存器AL中,余数在寄存器AH中。

第二种:使用32位的二进制数除以16位的二进制数。在这种情况下,因为16位的处理器无法直接提供32位的被除数,故要求被除数的高16位在DX中,低16位在AX中。我们通常用DX:AX来描述32位的被除数。同时,除数可以由16位的通用寄存器或者内存单元提供,指令执行后,商在AX中,余数在DX中。

9.使程序进入无限循环状态(初步了解jump指令)

例:infi : jump near infi

jump是转移指令,用于使处理器脱离当前的执行序列,转移到指定的地方执行。关键字near(伪指令)表示目标依然在当前代码段内。

第一种情况,若jump后跟物理地址(即段地址:偏移地址)则jump的操作码是0xEA

第二种情况,若jump后跟汇编地址,则jump的操作码是0xE9

10.主引导扇区有效标志:计算机的设计者决定,一个有效的主引导扇区,其最后两个字节的数据必须是0x55和0xAA。否则,这个扇区里保存的就不是一些有意而为的数据。

在示例代码中,通过计算得到前面的内容和结尾的0xAA55之间,有203字节的空洞。因此,源程序的第102行,用于声明203为0的数值来填补。

例:times 203 db 0(重复db 0指令203次)

 

posted @ 2019-08-05 10:30  learning_log  阅读(953)  评论(0编辑  收藏  举报