2011-12-25 第一章 基础知识
1.2 汇编语言的产生
1,汇编指令和机器指令的差别在于指令的表示方法上。汇编指令是机器指令便于记忆的书写格式。
2,汇编语言发展至今,有以下3类指令组成:
(1)汇编指令
(2)伪指令
(3)其他符号:如+,-,*,/等,由编译器识别,没有对应的机器码。
1.5 指令和数据
1,在内存或磁盘上,指令和数据没有任何区别,都是二进制信息。CPU在工作时为不同的信息赋予了不同的意义。
1.6 存储单元
1,微型机存储器的存储单元可以存储一个Byte,即8个二进制。
1.7 CPU对存储器的读写
1,根据传送信息的不同,总线从逻辑上又分为3类,地址总线,控制总线和数据总线。
1.15 内存地址空间
1,CPU在操控各个存储器的时候,把它们看作内存来对待,将它们总的看作一个由若干个存储单元组成的逻辑存储器,这个逻辑存储器即所谓的内存地址空间。
2,对CPU来讲,系统中的所有存储器中的存储单元都处于一个统一的逻辑存储器中,它的容量受CPU寻址能力的限制。
第二章 寄存器
2.1 通用寄存器
1,8086CPU有14个寄存器,所有寄存器都是16位的。
2.2 字在寄存器中的存储
1,字的高位字节和低位字节存在寄存器的高8位和低8位寄存器中。
2.3 几条汇编指令
1,在进行数据传送或运算时,要注意指令的两个操作对象的位数应当是一致的。
2.6 8086CPU给出物理地址的方法
1,8086有20位地址总线,可以传送20位地址,打到1MB的寻址能力。8086CPU又是16位结构,在内部一次性处理,传输,暂时存储的地址为16位。
2,8086CPU采用一种在内部用两个16位地址合成的方法来形成一个20位的物理地址。
3,物理地址=段地址 * 16 + 偏移地址
2.10 CS和IP
1,8086机中,任意时刻,CPU将CS:IP指向的内容当作指令执行。
2.11 修改CS,IP的指令
1,mov指令不能用于设置CS,IP的值。
2,若想同时修改CS,IP的内容,可用"jmp 段地址:偏移地址"的指令完成。
3,若想仅修改IP的内容,可用形如“jmp 某一个合法寄存器”的指令完成。
2.12 代码段
1,将一段内存当作代码段,仅仅是编程时的一种安排,CPU并不理会这种安排。
实验一 debug程序的几个命令
1,运行cmd,键入debug打开debug程序。
2,“r”查看寄存器,“r 寄存器“修改其内容。
3,”d 段地址:偏移地址“查看内存。
4,”e 起始地址 数据 数据 。。。“或者”e 起始地址“修改内存内容(第二种为交互方式)。
5,”u 起始地址“查看汇编指令。
6,”t“ 执行CS:IP指向的指令。
7,”a 起始地址“从该地址开始写入汇编指令。
第三章 寄存器(内存访问)
3.1 内存中字的存储
1,字单元,即存放一个字型数据(16位)的内存单元,由两个地址连续的内存单元组成。高地址内存单元中存放字型数据的高位字节,低地址内存单元中存放字型数据的低位字节。起始地址为低地址(字节)。
3.2 DS和[address]
1,“[...]”表示一个内存单元,“[...]”中的0表示内存单元的偏移地址。
2,8086CPU不支持将数据直接送入端寄存器。
3.7 CPU提供的栈机制
1,任意时刻,SS:SP指向栈顶元素。
2,8086CPU中,入栈时,栈顶从高地址向低地址方向增长。
3.10 栈段
1,push,pop等指令在执行的时候只修改SP。当栈满的时候,如果再次push,栈顶将环绕,覆盖了原来栈中的内容。
实验二
1,debug的t命令在执行修改寄存器SS的指令时,下一条指令也紧接着被执行。
第四章 第一个程序
4.2 源程序
1,在汇编语言远程中,包含两种指令,一种是汇编指令,一种是伪指令。
2,segment和ends的功能是定义一个段,sement说明一个段开始,ends说明一个段结束。一个段必须有一个名称来标识。
3,end是一个汇编程序的结束标志。
4,用assume将特定用途的段和相关的段寄存器关联起来。
5,
mov ax,4c00H
int 21H
这两个指令所实现的功能就是程序返回。
4.4-4.6 编译连接
1,产生中间文件的编译和连接:直接运行masm和link的时候不带源文件做参数。
2,不产生中间文件:运行masm和link的时候带文件作参数并最后加上一个分号";'。
4.9 程序执行过程的跟踪
1,debug将可执行文件加载内存后,cx中存放的是程序的长度。
2,ds段寄存器中存放着程序所在内存区的段地址,这个内存区的偏移地址为0。
3,这个内存区的前256个字节存放的是PSP,DOS用来和程序进行通讯。从256个字节向后存放的是程序。
实验三
1,PSP的头两个字节是 CD 20。
第五章 [BX]和loop指令
5.0
1,要完整地描述一个内存单元,需要两种信息:a,内存单元的地址;b,内存单元的长度(类型)
2,[bx]表示一个内存单元,它的偏移地址在bx中,段地址在ds中。
5.1 [BX]
1,inc bx的含义是bx中的内容加1.
5.2 loop指令
1,CPU执行loop指令的时候,要进行两步操作:a,(cx)=(cx)-1;b,判断x中的值,若为0跳出循环。
2,通常用loop实现循环时,cx中存放循环次数。
5.3 在debug中跟踪用loop指令实现的循环程序
1,在汇编程序中,数据不能以字母开头,要在前面加上0。
2,debug中的“g 偏移地址”命令格式,用于执行到该偏移地址时停止。
3,在debug中,p命令会自动重复执行循环中的命令,直到(cx)=0为止。
5.4 debug和汇编编译器masm对指令的不同处理
1,mov ax,[0]在debug中是有效的,而在源程序中,编译器会将[0]当作0。
2,在汇编源程序中,如果用指令访问一个内存单元,则在指令中必须用“[...]”来表示内存单元,如果在“[]”里用一个常量直接给出内存单元的偏移地址,就要在“[]”显式给出段地址所在的段寄存器。
3,如果在“[]”里用寄存器,比如bx,间接给出内存单元的偏移地址,则段地址默认在ds中。当然,也可以显示给出。
5.6 段前缀
1,出现在访问内存单元的指令中,用于显式地指明内存单元的段地址的"ds:","cs:","ss:","es:",在汇编中称为段前缀。
5.7
1,在一般PC中,DOS方式下,DOS和其他合法程序一般都不会使用0:200~0:2ff(00200h~002ffh)的256个字节的空间。
实验四
?怎么用[dx]间接给出偏移地址不行呢,用[bx]就行?
第六章 包含多个段的程序
6.0
1,程序取得所需合法空间的方法有两种,一是在加载程序的时候为程序分配,二是程序在执行的过程中向系统申请。
2,程序在被加载的时候取得所需的空间,可以在源程序中定义段来进行内存空间的获取。
6.1 在代码段中使用数据
1,“dw”用于定义字符型数据。
2,可执行文件由描述信息和程序组成。
3,start标号(或任意一个不重名的标号)指定程序的入口(其实是end后的标号指定,以在可执行文件的描述信息中指明入口)。
4,要将数据或者(和)栈与代码放置于同一段中,可以定义出代码前的一些空间来进行。
6.3 将数据,代码,栈放入不同的段
1,在程序中,段名就相当于一个标号,代表了段地址。
实验五
mov a:[bx],ax;错误
mov ds:[bx],es:[bx];错误
;没有h后缀的数字视为10进制
;使用segment定义数据段和栈段,debug刚载入程序的时候,DS,SS并不代表其段地址。
;每个段地址可配合偏移地址唯一指定16个字节
;数据按其定义的先后顺序在放置于程序地址空间(PSP头后面)
;db用于定义字节类型
分号用于注释
2011-12-27 第七章 更灵活的定位内存地址的方法
7.3 以字符数据形式给出的数据
1,在汇编程序中,用'.....'的方式指明数据是以字符的形式给出的。
7.5 [bx+idata]
1,[bx+idata]表示一个内存单元,它的偏移地址为(bx)+idata。
2,也可以写成如下格式
[200+bx]
200[bx]
[bx].200
7.6 si和di
1,si和di是8086CPU中和bx功能相近的寄存器,si和di不能分成两个8位寄存器来使用
7.8 [bx+di]和[bx+si]
1,[bx+di]和[bx+si]的含义相似。
2,[bx+si]表示一个内存单元,它的偏移地址为(bx)+(si)。
3,也可以写成如下格式
[bx][si]
7.9 [bx+si+idata]和[bx+di+idata]
1,不解释
2,也可以写成如下格式
[bx+200+si]
[200+bx+si]
[200][bx][si]
[bx].200[si]
[bx][si].200
第八章 数据处理的两个基本问题
8.1 bx,si,di和dp
1,在8086CPU中,只有这四个寄存器可以用在[...]中来进行内存单元的寻址。
2,这个四个寄存器不能出现如下的组合:bx+bp,si+di
3,在[]中使用寄存器bp,而没有显式给出段地址,则默认为在ss中。
8.2 机器指令处理的数据在什么地方
1,指令在执行前,所要处理的数据可以在3个地方:CPU内部,内存,端口。
8.3 汇编语言中数据位置的表达
1,在汇编指令中直接给出的数据称为立即数,执行前在CPU的指令缓冲区中。
2,使用段地址和偏移地址确定的数据执行前放在内存中。
8.5 指令要处理的数据有多长
1,在没有寄存器名存在的情况下,用操作符X ptr指明的内存单元的长度,X在汇编指令中可以为word或byte。
如 mov word ptr ds:[0],1
2,有些指令默认了访问的是字单元还是字节单元,如push指令只能进行字操作。
8.7 div指令
1,div是除法指令,使用div要注意以下问题:
a,除数:有8位和16位两种,在一个reg或内存中。
b,被除数:默认放在AX或DX和AX中,如果除数为8位,则被除数为16位,默认在AX中存放;如果除数为16位,则被除数则为32位,在DX和AX中存放,DX存放高16位。
c,结果:如果除数为8位,则AL存储商,AH存储余数。如果除数为16位,则AX存储商,DX存储余数。
(高位存商,低位存余)
8.8 dd伪指令
1,dd用来定义双字型数据。
8.9 dup
1,dup是一个操作符,在汇编语言中同db,dw,dd等一样,也是由编译器识别处理的符号。比如: db/dw/dd 3(重复次数) dup (0:要重复的数据),即 db 3 dup (0,1,3)
2011-12-28 第九章 转移指令的原理
9.0
1,可以修改IP,或同时修改CS和IP的指令系统统称为转移指令。
2,只修改IP时,称为段内转移
3,同时修改CS和IP时,称为段间转移
4,8086CPU的转移指令分为以下几类
a,无条件转移指令
b,条件转移指令
c,循环指令
d,过程
e,中断
9.1 操作符 offset
1,操作符offset在汇编中是由编译器处理的符号,功能是取得标号的偏移地址。
9.2 jmp指令
1,jmp指令要给出两种信息:
a,转移的目的地址(段间转移)
b,转移的距离(段内转移)
9.3 依据位移进行转移的jmp指令
1,“jmp short 标号”的功能为:(IP)=(IP)+8位位移
a,8位位移=标号处的地址-jmp指令后的第一个字节的地址;
b,short指明位移为一个字节表示的距离(补码表示)
c,位移距离由编译器算出。
2,“jmp near ptr 标号”:(IP)=(IP)+16位位移
9.4 转移的目的地址在指令中的jmp指令
1,“jmp far ptr 标号”实现的是段间转移。far ptr指明了用指令的段地址和偏移地址修改CS和IP。
2,该指令的机器码中,高16位(右边)是段地址,低十六位是偏移地址
9.5 转移地址在寄存器中的jmp指令
1,“jmp 16位寄存器”:(IP)=(16位寄存器的值)
9.6 转移地址在内存中的jmp指令
1,“jmp word ptr 内存单元的地址”:段内转移,16位偏移地址
2,“jmp dword ptr 内存单元的地址”:段间转移,CS=内存单元地址+2,IP=内存单元地址
9.7 jcxz指令
1,“jcxz 标号”为有条件的转移指令,所有的有条件转移指令都是短转移,16位偏移地址。
2,如果(cx)=0,则转移到标号处执行,否则什么也不做(继续往下执行)
9.8 loop指令
1,loop指令为循环指令,所有的循环指令都是短转移,16位偏移地址。
9.9 根据位移进行的转移的意义
1,绝对地址有很可能改变,但偏移地址是不变的。
实验八
1,可以正确返回,复制标号s2地址的两个字节时,在标号s处执行jmp,刚好偏移地址是第一个语句。
实验九
1,两个段寄存器不能出现在同一语句
2,代码:
assume cs:codesg
datasg segment
db 'w',02h,'e',02h,'l',02h,'c',02h,'o',02h,'m',02h,'e',02h,' ',00h
db 't',24h,'o',24h,' ',00h
db 'm',71h,'a',71h,'s',71h,'m',71h
db '!',cah
datasg ends
codesg segment
start: mov ax,datasg
mov ds,ax
mov ax,0b800h
mov es,ax
mov bx,0h
mov si,0h
mov cx,12
row: add bx,160
loop row
mov cx,32
column: add si,2
loop column
mov cx,16
mov di,0h
copy1: mov ax,ds:[di]
mov es:[bx+si],ax
add si,2h
add di,2h
loop copy1
mov ax,4c00h
int 21h
codesg ends
end start
3,80*25彩色字符模式
内存地址空间中,B8000H~BFFFFH共32KB的空间,为80*25彩色字符模式的显示缓冲区。向这个地址空间写入数据,写入的内容将立即出现在显示器上。
在80*25彩色字符模式下,显示器可以显示25行,每行80个字符,每个字符有256中属性。
每个字符占用两个字节,高位存放属性,低位存放ASCII码。
缓冲区分8页,每页4KB。一般情况下显示第0页的内容
属性字节的格式
7 6 5 4 3 2 1 0
—— ———————— —— —————————
BL R G B I R G B
闪烁 背景 高亮 前景
第十章 CALL和RET指令
10.0
call和ret指令都是转移指令。
10.1 ret和retf
1,CPU执行ret指令时,相当于进行:
pop IP
2,CPU执行retf指令时,相当于进行:
pop IP
pop CS
10.2 call指令
1,CPU执行call指令时,进行两步操作:
a,将当前的IP或CS和IP压入栈中;
b,转移。
2,call指令不能实现短转移。(16位近转移或段间转移)
10.3 根据位移进行转移的call指令
1,CPU执行“call 标号”时,相当于执行:
push IP
jmp near ptr 标号
10.4 转移的目的地址在指令中的call指令
1,“call far ptr 标号”实现的是段间转移,其相当于:
push CS
push IP
jmp far ptr 标号
10.5 转移地址在寄存器中的call指令
1,“call 16位reg”相当于执行:
push IP
jmp 16位reg
10.6 偏移地址在内存中的call指令
1,call word ptr 内存单元地址,相当于
push IP
jmp word ptr 内存单元地址
2,call dword ptr 内存单元地址,相当于
push CS
push IP
jmp dword ptr 内存地址单元
10.8 mul指令
1,两个相乘的数:两个相乘的数,要么都是8位的,要么都是16位。如果是8位,一个默认放在al中,另一个放在8位reg或内存字节单元中;如果是16位,一个默认在ax中,另一个放在16位reg或内存字单元中。(不能有立即数)
2,结果:如果是8位乘法,结果默认放在ax中;如果是16位乘法,结果高位默认是DX,低位AX。
10.10 参数和结果传递的问题
1,用寄存器来存储参数和结果是最常使用的方法。
10.11 批量数据的传递
1,如果传递的数据太多的时候,可以将批量数据放到内存中,然后用寄存器传递首地址。对于返回值也可用同样方法。
2,除了用寄存器传递参数外,还有一种通用的方法是用栈来传递参数。
10.12 寄存器冲突的问题
1,一个一般化的问题:子程序使用的寄存器,很可能在主程序中也要使用,造成了寄存器使用上的冲突。
2,问题解决:在子程序的开始将子程序中所有用到的寄存器中的内容都在栈里保存起来,在子程序返回前再恢复。
2011-12-29 第十一章 标志寄存器flag
11.0
8086CPU的标志寄存器有16位,其中存储的信息通常被称为程序状态字(PSW)。
11.1 ZF标志
1,flag的第6位是ZF,零标志位。指令执行后,结果为0,则ZF=1,否则ZF=0。
11.2 PF标志
1,flag的第2位是PF,奇偶标志位。若结果所有bit位1的个数为偶数,则pf=1.
11.3 SF标志
1,第七位是SF标志,符号标志位。如果结果(补码表示)为负,则SF=1.(该标志总是跟结果的最高位相同)
11.4 CF标志
1,第0位,进位标志位。无符号运算时,最高有效位向更高位进位或者借位时,CF=1.
11.5 OF标志
1,第11位,溢出标志位。有符号运算时,结果超出其表示范围时,OF=1。
11.6 adc指令
1,adc是带进位加法指令,格式:
adc 操作数对象1,操作对象2
功能:操作对象1 = 操作对象1 + 操作对象2 + CF
11.7 sbb指令
1,sbb是带借位减法指令:格式
sbb 操作对象1,操作对象2
功能:操作对象1 = 操作对象1 - 操作对象2 - CF
11.8 cmp指令
1,cmp指令格式:
cmp 操作对象1,操作对象2
功能:计算操作对象1 - 操作对象2 ,但不保存结果,仅仅根据计算结果对标志寄存器进行设置。
11.9 检测比较结果的条件转移指令
1,无符号数比较结果检测指令
je 等于则转移 zf=1
jne
jb 小于则转移 cf=1
jnb
ja 大于则转移 cf=0且zf=0
jna
11.10 DF标志和串传送指令
1,flag的第10位是DF,方向标志位。在串处理指令中,控制每次操作后si,di的增减。
2,串传送指令:movsb
功能是将ds:si指向的内存单元中的字节送入es:di中,然后根据DF位的值,将si和di递增(df=0)或递减(df=1)
3,串传送指令:movsw 同movsb,但是传送字,si和di的步进为2。
4,对DF位的设置指令:
cld:清零
std:置一
4,rep指令
根据cx的值,重复执行后面的串传送指令,如:
rep movsb
11.11 pushf和popf指令
1,两指令将标志寄存器的值压栈和出栈。
11.12 标志寄存器在debug中的表示
标志 值=1 值=0
of OV NV
sf NG PL
zf ZR NZ
pf PE PO
cf CY NC
df DN UP
第十二章 内中断
12.1 内中断的产生
1,对于8086CPU,当CPU内部有下面的情况发生的时候,将产生相应的中断信息。
a,除法错误,如除法溢出
b,单步执行
c,执行into指令
d,执行int指令
2,8086CPU用称为中断类型码的数据(一个字节)来表示中断信息的来源。
3,一些中断类型码:
a,除法错误:0
b,单步执行:1
c,执行into:4
d,执行int:该指令格式int n中的n。
12.4 中断过程
1,8086CPU在收到中断信息后,锁引发的终端过程:
a,取得中断类型码
b,将标志寄存器的值压栈
c,设置标志寄存器的第八位TF和第九位IF的值为0
d,CS的内容压栈
e,IP的内容压栈
f,从内存地址为中断类型码*4和中断类型码*4+2的两个字单元中读取中断处理程序的入口地址设置IP和CS。(内存0000:0000到0000:03ff的1024个字节存放中断向量表)
2,该中断过程是由硬件执行的,程序员无法改变。
12.5 中断处理程序和iret指令
1,中断处理程序的编写方法跟子程序相似,只是使用iret指令作返回。
2,iret指令相当于:
pop IP
pop CS
popf
(这是说相当于)
12.8 安装
1,一个汇编语句:
mov cx,offset do0end-offset do0
12.11 单步中断
1,如果标志位TF=1,则CPU在执行完一条指令之后,就要去执行单步中断处理程序。
12.12 响应中断的特殊情况
1,某些情况下,CPU在执行完当前指令后,即使发生中断,也不会去响应。如修改栈指针的操作。
2,栈指针的设置应该在设置完栈段地址后(SS),马上设置栈指针地址(SP)。
第十三章 int指令
13.1 int指令
1,一般情况下,系统将一些具有一定功能的子程序,以中断处理程序的方式提供给应用程序调用。
13.2 编写供应用程序调用的中断例程
1,编写中断例程和编写子程序的时候具有同样的问题,就是避免寄存器的冲突。
13.3 BIOS和DOS中断例程的安装过程
1,开机后,CPU加电,初始化CS=0FFFFH,IP=0,该处有一跳转指令,转去执行BIOS中的硬件系统检测和初始化程序。
2,初始化程序设置中断向量表,指向其固化的中断例程。
3,硬件检测和初始化完成后,调用int 19h进行操作系统的引导。
4,DOS启动后,除了其他工作,还将它所提供的中断例程装入内存,并建立中断向量。
13.4 BIOS中断例程应用
1,int 10h中断例程是BIOS提供的中断例程,其中包含了多个和屏幕输出相关的子程序。
2,BIOS和DOS提供的中断例程,都用ah来传递子程序的编号。
13.5 DOS中断例程的应用
1,int 21h中断例程是DOS提供的中断例程,其中包含了DOS提供给程序员在编程时调用的子程序。
2,4ch号子程序以al参数作返回值。
2011-12-30 第十四章 端口
14.0
1,CPU可以直接读写以下三个地方的数据
a,CPU内部寄存器
b,内存单元
c,端口
14.1 端口的读写
1,在PC系列中,CPU最多可以定位64K个不同的端口,范围为0~65536.
2,端口的读写只有两条指令:in 和 out,读和写。
3,在in和out指令中,只能使用ax或al来存放从端口中读入的数据或要发送到端口中的数据。
4,255及以内的端口可以用立即数指定,255以后的端口要放在dx中。(是吗?)
14.2 CMOS RAM芯片
1,该芯片内部有两个端口,端口地址为70h和71h。70h为地址端口,存放要访问的CMOS RAM单元的地址;71h为数据端口,存放从选定的CMOS RAM单元中读取的数据,或要写入的数据。如读写COMS RAM的2号单元:
a,将2送入端口70h;
b,从端口71h读出2号单元的内容。
14.3 shl和shr指令
1,为逻辑左右移位指令,功能为:
a,将一个寄存器或内存单元中的数据向左或右移位;
b,将最后移出的一位写入CF中;
c,最低(高)位用0补充。
2,如果移动位数大于1时,必须将移动位数放在cl中。如:
mov al,01010001b
mov cl,3
shl al,cl
14.4 CMOS RAM中存储的时间信息
1,在COMS RAM中,存放着当前的时间:年,月,日,时,分,秒。六个信息的长度都为1个字节,存放单元为:
秒:0 分:2 时:4 日:7 月:8 年:9
这些数据以BCD码的方式存放。
2,两个BCD码表示两个十进制数,高4位为十位,低四位为个位。
实验14 访问COMS RAM
1,CMOS RAM中存储着系统的配置信息,除了保存时间信息的单元外,不要向其他的单元中写入内容,否则将引起一些系统错误。
十五章 外中断
15.1 接口芯片和端口
1,外设接口芯片的内部有若干寄存器,CPU将这些寄存器当作端口来访问。
2,外设的输入输出数据都要经过端口跟内存和CPU交互。
15.2 外中断信息
1,可屏蔽中断是CPU可以不响应的外中断。若IF=1,则响应,否则不响应。
2,将IF置0的原因是,在进入中断处理程序后,禁止其他的可屏蔽中断。
3,不可屏蔽中断是CPU必须响应的外中断。对于8086CPU,不可屏蔽中断的中断类型码固定为2.
4,几乎所有由外设引发的外中断都是可屏蔽的。
15.3 PC机键盘的处理过程
1,一般将按下一个键时产生的扫描码称为通码,松开一个键产生的扫描码为断码。扫描码长度为一个字节,通码第七位为0,断码第7位为1。扫描码都被送到60h端口。
2,键盘的输入到达60h端口时,相关芯片就会向CPU发出中断类型码为9的可屏蔽中断信息。CPU检测到该中断后,如果IF=1则会响应中断执行int9中断例程。
3,int9中断例程的主要工作:
a,读出60h端口的扫描码;
b,如果是字符扫描码,则将扫描码及其对应的ASCII码送到BIOS的键盘缓冲区;如果是控制键和切换键的扫描码则将其转变为状态字节,写入内存中存储状态字节的单元。
c,对键盘系统进行相关的控制,如,发送应答信息。
4,0040:17单元存储键盘状态字节,该字节记录了控制键和切换键的状态。
15.4 编写int9中断例程
1,本章汇总所有关于键盘的程序,因要访问真实硬件,必须在DOS实模式下运行。
第十六章 直接定制表
16.1 描述了单元长度的标号
1,数据标号,标记了存储数据的单元地址和长度.
16.2 在其他段中使用数据标号
1,一般来说,不在代码段中定义数据,而是将数据定义到其他段中。
2,在后面加有“:”的地址标号,只能在代码段中使用,不能在其他段中使用。
3,如果想在代码段中直接用数据标号访问数据,则需要用伪指令assume将标号所在的段和一个段寄存器联系起来。
4,可以将标号当作数据来定义,此时,编译器将标号所表示的地址当作数据的值。如:
data segment
a db 1,2,3,4,5,6,7,8
b dw 0
c de a,b
data ends
数据标号c处存储的两个字型数据为标号a,b的偏移地址。再如:
data segment
a db 1,2,3,4,5,6,7,8
b dw 0
c dd a,b
data ends
数据标号c处存储的两个双字型数据为标号a的偏移地址和段地址,b的偏移地址和段地址。
16.3 直接定址表
1,乘除是非常耗时的运算,大约是加法,比较等指令的5倍。
16.4 程序入口地址的直接定址表
1,可以在直接定址表中存储子程序的地址,从而方便地实现不同子程序的调用。
2011-12-31 第十七章 使用BIOS进行键盘输入和磁盘读写
17.2 使用int 16h中断例程读取键盘缓冲区
1,BIOS提供的int 16中断例程中包含一个最重要的功能是从键盘缓冲区中读取一个键盘输入,该功能的编号为0.
17.4 应用int 13h中断例程对磁盘进行读写
1,BIOS提供的访问磁盘的中断例程为int 13h。
2,其入口参数如下:
(ah)=int 13h的功能号(2号功能为读,3号为写)
(al)=读取的扇区数
(ch)=磁道号
(cl)=扇区号
(dh)=磁头号
(dl)=驱动器号
返回参数:
操作成功:(ah)=0,(al)=读入的扇区数
操作失败:(ah)=出错代码
ps:上个周六看到的一篇教程终于让我决定要学学汇编语言了,上周日开始到今天周六刚好一个星期,赶在2012来临之前算是把这本书看完了,也留下了一万字的笔记。只是从第十章开始就没做过书上的实验了,后面的综合研究也只是一页一页的翻了过去。改写书上提到的一个故事:COOL先生用了3天(或更短)的时间就学会了汇编语言。我会相信这个故事,只是故事的主角不会是我。