汇编笔记

寄存器

8086 CPU 中寄存器总共为 14 个,且均为 16 位 。

  • 数据寄存器:

    AX (Accumulator):累加寄存器,也称之为累加器;
    BX (Base):基地址寄存器;
    CX (Count):计数器寄存器;
    DX (Data):数据寄存器;

  • 指针寄存器:

    SP (Stack Pointer):堆栈指针寄存器;
    BP (Base Pointer):基指针寄存器;

  • 变址寄存器:

    SI (Source Index):源变址寄存器;
    DI (Destination Index):目的变址寄存器;

  • 控制寄存器

    IP (Instruction Pointer):指令指针寄存器;
    FLAG:标志寄存器;

  • 段寄存器

    CS (Code Segment):代码段寄存器;
    DS (Data Segment):数据段寄存器;
    SS (Stack Segment):堆栈段寄存器;
    ES (Extra Segment):附加段寄存器;

任何时间CS IP 指向CPU当前要读取指令的地方.CSx16+IP.
mov指令不能用于设置CS/IP的值。

Bx和Loop,做循环

执行loop指令时的两步操作:
1.(cx)=(cx)-1;
2.判断cx中的值,不为0则中转至loop标号处执行程序,如果为0则向下执行。

16位 段+偏移 的地址表示

当时cpu是16位的,但是内存64k有点小就扩容到1M,也就是20根地址线。为了兼容之前的架构,就设计出了通过段寄存器左移4位+偏移地址的寻址方式。

地址总线有20根,但是数据总线只有16根。所以需要用两个16进制表示20进制的地址。
段地址(16位)×16+偏移地址(16位)=地址(20位)。
如:(ax)=((ds)*16 + (bx)+200)

更灵活的寻址方式:
[bx/si/di + idata]
[bx + si/di]
[bx + si/di + idata]

jmp跳转系列指令

Call Ret 指令。CS:IP指向下一个要执行的指令。SS:SP指向栈顶。

依赖标志寄存器的 加减乘除

cmp指令:cmp ax,bx
zf=1 说明 (ax)=(bx)
zf=0 说明 (ax)!=(bx)
cf=1 说明 (ax)<(bx)
cf=0 说明 (ax)>(bx)
cf=0 并且 zf=0 说明 (ax)>(bx)
cf=1 并且 zf=1 说明 (ax)<=(bx)

内中断

中断向量表,中断例程,类似于call ret

int指令

Interrupt主要用来调用BIOS和操作系统提供的一些中断

端口

  • 读写指令 in/out

主板上各种芯片的RAM。
都有一组供CPU读写的寄存器。

CPU可以直接读写的地方:
1.CPU内部的寄存器。
2.内存单元
3.端口。

cmos芯片:
地址端口70h.
数据端口71h.

  • shl、shr

shl是逻辑左移指令,功能:
1.将一个寄存器或内存单元中的数据向左移位。
2.将最后移出的一位写入CF中。
3.最低位用0补充。

将X逻辑左移一位,相当于执行X=X*2.
将X逻辑右移一位,相当于执行X=X/2.

外中断

中断的产生原因:比如,外设的输入到达。

CPU与外设的交互,都是将数据送入到端口中。
即CPU通过端口与外部设备进行联系。

1.可屏蔽中断
内中断设置IF=0,TF=0. 可屏蔽中断会判断IF=1才执行中断。
因此,内中断执行时,会禁用可屏蔽中断。
2.不可屏蔽中断(类型码固定为2)

几乎所有由外设引发的中断都是外中断,都是中屏蔽中断。

键盘的输入到达时,引发9号中断。

直接定址表

在后面加有”:”的地址标号,只能在代码段中使用,不能在其它段中使用。
seg操作符,功能为取得某一标号的段地址。

将通过给出的数据进行计算或比较而得到结果的问题,转化为用给出的数据作为查表的依据,通过查表得到结果的问题。具体的查表方法,是用查表的依据数据,直接计算出所要查找的元素在表中的位置。像这种可以通过依据数据,直接计算出所要找的元素的位置的表,叫做直接定址表。

使用BIOS进行键盘输入和硬盘读写

键盘输入引发的中断:int 9h

读取键盘缓冲区中断:int 16h
ah=扫描码,al=ASCII码.

硬盘读写中断:int 13h
ah=2/3(2表示读扇区,3表示写扇区)

综合研究

用C语言编程可以不用变量吗?
用C语言编程可以不用main函数吗?
我们能写一个printf函数吗?(可以接受不定数量的参数)

其它

  • 微机中常用的Intel系列微处理器的主要发展过程是:

8080,8086/8088,80186,80286,80386,80486,Pentium,Pentium II,Pentium III,Pentium4.
80386是划时代的产品,可以在3个模式下工作:实模式,保护模式,虚拟8086模式。

  • 负数的表示,补码

反码,0 -> 1, 1 -> 0.
补码,按位取反码,加1。

  • 用栈传递参数

由调用者将需要传递给子程序的参数压入栈中,子程序从栈中取得参数。
子程序返回时要使用ret n。
ret n的含意:
pop ip
add sp,n

你可能感兴趣的:(汇编笔记)