2012年1月5日
1.CPU可以直接读写以下3个地方的数据:
a.CPU内部的寄存器;
b.内存单元;
c.端口。
2.访问端口时,CPU通过端口地址定位端口。
3.在PC系统中,CPU最多可以定位64KB个不同的端口,则端口地址的范围是0~65535。
4.CPU对端口只有两条读写指令:in和out。
例:in al,60h ;从60h端口读入一个字节
5.在in和out指令中,只能使用ax和al来存放从端口中读入的数据或要发送到端口中的数据。访问8位端口时用AL,访问16位端口时用ax。
对256~65535的端口进行读写时,端口号放在DX中。
6.CPU通过地址为70h和71h的两个端口读写CMOS RAM。
70h为地址端口,存放要访问的CMOS RAM单元的地址。
71h为数据端口,存放从选定的CMOS RAM单元中读取的数据,或要写入到其中的数据。
7.shl是逻辑左移指令,功能为:
a.将一个寄存器或内存单元中的数据向左移位;
b.将最后移出的一位写入CF中;
c.最低位用0补充。
8.shr是逻辑右移指令,功能为:
a.将一个寄存器或内存单元中的数据向右移位;
b.将最后移出的一位写入CF中;
c.最高位用0补充。
实验14 访问CMOS RAM
略。
END
2012年01月05日
1.int指令的格式为:int n,n为中断类型码,它的功能是引发中断过程。
2.CPU执行int n指令,相当于引发一个n号中断的中断过程,执行过程如下:
(1)取中断类型码n;
(2)标志寄存器入栈,IF=0,TF=0;
(3)CS、IP入栈;
(4)(IP)=(n*4),(CS)=(n*4+2).
3.int 10h中断例程是BIOS提供的中断例程,其中包含了多个和屏幕输出相关的子程序。
4.int 21h中断例程是DOS提供的中断例程,其中包含了DOS提供给程序员在编程时调用的子程序。
实验13 编写、应用中断例程
略。
END
2012年01月04日
2012年1月4日
1.8086CPU中4种中断源及中断类型码:
(1)除法错误:0;
(2)单步执行:1;
(3)执行into指令:4;
(4)执行int指令。该指令的格式为 int n,指令中的n为字节型立即数,是提供给CPU的中断类型码。
2.中断向量表,是中断处理程序入口地址的列表。
中断向量表在内存中保存,其中存放着256个中断源所对应的中断处理程序的入口。
对于8086PC机,中断向量表指定放在内存地址0处。
3.中断过程:
(1)取得中断类型码N;
(2)pushf
(3)TF=0,IF=0
(4)push CS
(5)push IP
(6)(IP)=(N*4),(CS)=(N*4+2)
4.单步中断的过程:
(1)取得中断类型码1;
(2)标志寄存器入栈,TF、IF设置为0;
(3)CS、IP入栈;
(4)(IP)=(1*4),(CS)=(1*4+2)
5.一般情况下,CPU会响应中断。
特殊情况下,CPU在执行完当前指令后,即使是发生中断,也不会响应。
实验12 编写0号中断的处理程序
略。
今天和昨天一样,也看了四章书,不过不是很仔细地看,有些地方跳过了。继续努力!
END
2012年01月04日
1.在8086CPU中,标志寄存器的作用:
(1)用来存储相关指令的某些执行结果;
(2)用来为CPU执行相关指令提供行为依据;
(3)用来控制CPU的相关工作方式。
2.flag寄存器按位起作用。
3.标志寄存器的第6位是ZF,零标志位。结果为0,则ZF=1。
4.flag的第2位是PF,奇偶标志位。1的个数为偶数,则PF=1.
5.flag的第7位是SF,符号标志位。结果为负,则SF=1.
6.flag的第0位是CF,进位标志位。
7.flag的第11位是OF,溢出标志位。发生溢出,则OF=1.
8.adc:带进位加法指令。
指令格式:adc 操作对象1,操作对象2
功能:操作对象1=操作对象1+操作对象2+CF
9.sbb:带借位减法指令。
指令格式:sbb 对象1,对象2
功能:对象1=对象1-对象2-CF
10:cmp:比较指令。
指令格式:cmp 对象1,对象2
功能:对象1-对象2,不保存结果,根据计算结果对标志寄存器进行设置。
11.flag的第10位是DF,方向标志位。在串处理指令中,控制每次操作后si和di的增减。
df=0 每次操作后si和di递增;
df=1 每次操作后si和di递减。
12.串传送指令
(1)movsb,执行movsb指令相当于下面操作:
a.((es)*16+(di))=((ds)*16+(si))
b.如果df=0则 (si)=(si)+1 (di)=(di)+1;如果df=1则(si)=(si)-1 (di)=(di)-1.
(2)movsw,movsw的功能是将ds:si指向的内存字单元中的字送入ds:di中,然后根据flag中df位的值,将si和di递增2或递减2.
(3)rep,格式: rep movsb/movsw
rep的作用是根据cx的值,重复执行后面的串传送指令。
13.pushf的功能是将标志寄存器中的值压栈。
popf是从栈中弹出数据,送入标志寄存器中。
pushf和popf为直接访问标志寄存器提供了一种方法。
实验11 编写子程序
略。
END
2012年01月04日
1.ret指令用栈中的数据,修改IP的内容,从而实现近转移。
retf指令用栈中的数据,修改CS和IP的内容,从而实现远转移。
2.call指令不能实现短转移。
3.call指令:
(1)call 标号 (将当前的IP压栈后,转到标号处执行指令)
(2)call far ptr 标号 (实现段间转移)
(3)call 16位reg
(4)call word ptr 内存单元地址
(5)call dword ptr 内存单元地址
4.mul指令:乘法指令
格式: mul reg 或 mul 内存单元
(1)两个相乘的数,要求都是8位或都是16位。如果是8位,一个默认放在AL中,另一个放在8位reg或内存字节单元中;如果是16位,一个默认放在 AX中,另一个放在16位reg或内存字单元中。
(2)结果:如果是8位乘法,结果默认放在AX中,如果是16位乘法,结果高位默认在DX中存放,低位在AX中存放。
实验10 编写子程序
略。
END
2012年01月04日
1.转移指令:可以修改IP,或同时修改CS和IP的指令的统称。
2.8086CPU的转移行为:
(1)段内转移:只修改IP。如 jmp ax。
(2)段间转移:同时修改CS和IP。如 jmp 1000:0 。
3.由于转移指令对IP的修改范围不同,段内转移分为短转移和近转移。
短转移IP的修改范围为-128~127.
近转移IP的修改范围为-32768~32767.
4.8086CPU转移指令分类:
a.无条件转移指令;
b.条件转移指令;
c.循环指令;
d.过程;
e.中断。
5.操作符offset的功能是取得标号的偏移地址。
6.段内短转移的jmp指令:jmp short 标号
段内近转移的jmp指令:jmp near ptr 标号
段间转移(远转移):jmp far ptr 标号
转移地址在reg中的jmp指令:jmp 16位reg
7.转移地址在内存中的jmp指令:
(1)jmp word ptr 内存单元地址 (段内转移)
(2)jmp dword ptr 内存单元地址 (段间转移)
8.所有的有条件转移指令都是短转移,对IP的修改范围都为-128~127.
9.jcxz指令为有条件转移指令:
指令格式:jcxz 标号 (如果(cx)=0,转移到标号处执行)
10.所有的循环指令都是短转移。如 loop 指令。
11.loop指令格式: loop标号 ((cx)=(cx)-1,如果(cx)不为零,转移到标号处执行)
12.根据位移进行转移的指令,它们的转移范围受到转移位移的限制。
实验8 分析一个奇怪的程序
略。
实验9 根据材料编程
略。
END
2012年01月04日
2012年1月3日
1.描述性符号:reg和sreg
reg集合:ax/bx/cx/dx/ah/al/bh/bl/ch/cl/dh/cl/sp/bp/si/di;
sreg集合:ds/ss/cs/es。
2.在8086CPU中,只有bx、si、di和bp可用在“[]“中来进行内存单元的寻址。
在”[]“中,这4个寄存器可以单个出现,或只能以四种组合出现:bx和si、bx和di、bp和xi、bp和di。
只要在[]中使用bp,而指令没有显式给出段地址,段地址就默认在ss中。
3.立即数(idata):直接包含在机器指令中的数据。
4.寻址方式总结:见教材164页表格。
5.指令要处理的数据有多长——
(1)通过寄存器名指明数据尺寸;
(2)在没有寄存器名存在的情况下,用操作符X ptr指明内存单元的长度,X在汇编指令中可以为word或byte;
(3)其他方法。
6.div指令:除法指令
(1)除数:有8位和16位两种,在一个reg或内存单元中;
(2)被除数:默认放在AX或DX和AX中。如果除数为8位,被除数则为16位,默认放在AX中;如果除数为16位,被除数则为32位,放在DX和AX中, DX存放高16位,AX存放低16位;
(3)结果:如果除数为8位,则AL存储除法操作的商,AH存放除法操作的余数;如果除数为16位,则AX存放除法操作的商,DX存放除法操作的余 数。
7.伪指令dd:定义dword类型数据
操作符dup:用来进行数据的重复。
例:db 3 dup (0,1,2) 相当于 db 0,1,2,0,1,2,0,1,2
实验7 寻址方式在结构化数据访问中的应用
略。
今天看了四章书,要加倍努力!
END
2012年01月03日
6-1.应该考虑用多个段来存放数据、代码和栈。
7-1.and指令:逻辑与指令,按位进行与运算。相应位置0.
or指令:逻辑或指令,按位进行或运算。相应位置1.
2.小写字母的ASCII码值比大写字母的ASCII码值大20H。
3.[bx+idata]表示一个内存单元,偏移地址为(bx)+idata(即bx中的数值加上idata)。
4.si和di不能够分成两个8位寄存器来使用。
5.[bx+si]和[bx+di]:
[bx+si]表示一个内存单元,偏移地址为(bx)+(si).
6.[bx+si+idata]和[bx+di+idata]:
[bx+si+idata]表示一个内存单元,偏移地址为(bx)+(si)+idata。
7.不同寻址方式的灵活应用:
(1)[idata]用一个常量表示地址,可用于直接定位一个内存单元;
(2)[bx]用一个变量来表示内存地址,用于间接定位一个内存单元;
(3)[bx+idata]用一个变量和一个常量表示内存地址,可以在一个起始地址的基础上用变量间接定位一个内存单元;
(4)[bx+si]用两个变量表示地址;
(5)[bx+si+idata]用两个变量和一个常量表示地址。
8.一般来说,在需要暂存数据的时候,我们都应该使用栈。
实验6 实践课程中的程序
略。
END
2012年01月03日
1.完整描述一个内存单元需要两种信息:
a.内存单元的地址;
b.内存单元的长度(类型)。
2.[bx]表示一个内存单元,它的偏移地址在bx中,段地址在ds中。
3.约定:
a.描述性符号“()”表示一个寄存器或一个内存单元的内容;
b.“()”中的元素类型:寄存器名;段寄存器名;内存单元中的物理地址(一个20位的数据)。
c.“(X)”表示的数据类型:字节;字。由寄存器名或具体运算决定。
d.符号idata表示常量。
5.1 [BX]
5.2 Loop指令——
loop指令格式:loop 标号
CPU执行loop指令时,进行两步操作:
a.(cx)=(cx)-1;
b.判断CX中的值,不为零则转至标号处执行程序,如果为零则向下执行。
5.3 在Debug中跟踪用loop指令实现的循环程序
5.4 Debug和汇编编译器masm对指令的不同处理
5.5 loop的[bx]的联合应用
5.6 段前缀
5.7 一段安全的空间
5.8 段前缀的使用
实验4 [bx]和loop的使用
略。
END
2012年01月03日
本章是实际操作的一章,仅摘录少数要点。
1.伪指令由编译器执行。
2.segment和ends成对使用,定义一个段。
3.一个段必须有一个名称标识,此名称为“标号”。
4.end标记整个程序的结束。
5.assume将有特定用途的段和相关的段寄存器关联起来。
6.程序返回指令:
mov ax,4c00H
int 21H
END
2012年01月02日