随笔 - 13, 文章 - 0, 评论 - 0, 引用 - 0
数据加载中……

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日

posted @ 2012-01-05 21:06 龙傲天下 阅读(313) | 评论 (0)编辑 收藏

汇编语言学习笔记——第十三章 int指令


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日

posted @ 2012-01-05 20:57 龙傲天下 阅读(236) | 评论 (0)编辑 收藏

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日

posted @ 2012-01-04 21:46 龙傲天下 阅读(229) | 评论 (0)编辑 收藏

汇编语言学习笔记——第十一章 标志寄存器


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日

posted @ 2012-01-04 21:35 龙傲天下 阅读(307) | 评论 (0)编辑 收藏

汇编语言学习笔记——第十章 CALL和RET指令


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日

posted @ 2012-01-04 21:18 龙傲天下 阅读(346) | 评论 (0)编辑 收藏

汇编语言学习笔记——第九章 转移指令的原理


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日

posted @ 2012-01-04 21:09 龙傲天下 阅读(224) | 评论 (0)编辑 收藏

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日

posted @ 2012-01-03 23:54 龙傲天下 阅读(311) | 评论 (0)编辑 收藏

汇编语言学习笔记——第六章 包含多个段的程序 &第七章 更灵活的定位内存地址的方法


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日

posted @ 2012-01-03 23:39 龙傲天下 阅读(377) | 评论 (0)编辑 收藏

汇编语言学习笔记——第五章 [BX]和loop指令


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日

posted @ 2012-01-03 19:09 龙傲天下 阅读(272) | 评论 (0)编辑 收藏

汇编语言学习笔记——第四章 第一个程序


本章是实际操作的一章,仅摘录少数要点。

1.伪指令由编译器执行。
2.segment和ends成对使用,定义一个段。
3.一个段必须有一个名称标识,此名称为“标号”。
4.end标记整个程序的结束。
5.assume将有特定用途的段和相关的段寄存器关联起来。
6.程序返回指令:
    mov ax,4c00H
    int 21H

END
2012年01月02日

posted @ 2012-01-03 18:57 龙傲天下 阅读(295) | 评论 (0)编辑 收藏