王爽《汇编语言》 复习资料

X86汇编语言总结

转载自http://blog.csdn.net/cto_51/article/details/8827862

  • AX、BX、CX、DX一般用来存放数据

  • [BX]、[BP]、[SI]、[DI]中一般存放着某个段寄存器的偏移地址,默认情况下,[BX]中存放着数据段(DS)的偏移地址,[BP]中存放着栈段(SS)的偏移地址(功能和SP类似),其中BX只能和SI、DI组合,BP只能和SI、DI组合,SI、DI间是不能组合的

  • Loop指令一般搭配着CX寄存器使用,每循环一次,CX寄存器中的值减少1

  • 执行PUSH指令时,SP-2,执行POP时,SP+2
  • 个人的一点总结:压栈时,先减后压;出栈时,先出后加

  • dw表示define word,即定义字,有16位
  • db表示define byte,即定义字节,有8位
  • dd表示double world,即定义双字,有32位

  • ptr来指定程序操作的内存的具体的大小
  • 例如:

mov wordptr ds:[0],1                   表示将1存放到大小为一个字(两个字节)的内存单元中

mov byte ptrds:[0], 1                           表示将1存放到大小为一个字节的内存单元中

  • div除法指令;inc:++指令;

  • dup是一个操作符,在汇编语言中同db、dw、dd等一样,也是由编译器识别处理的符号(伪指令)。Dup通常和db、dw、dd配合起来使用。dup示例如下:

db 3 dup(0) ------à定义了3个字节,它们的值都是0,相当于db 0,0,0

db 3 dup(0, 1, 2)-----à定义了9个字节,它们是:0、1、2、0、1、2、0、1、2

  • offset在汇编语言中是由编译器处理的符号,它的功能是取得标号的偏移地址。

  • NOP空操作指令,功能: 本指令不产生任何结果,仅消耗几个时钟周期的时间,接着执行后续指令,常用于程序的延时等。

  • Jmp short ptr 标号

Ø  8位位移=“标号”处的地址-jmp指令后的第一个字节的地址;

Ø  Short ptr指明此处的位移为8位位移,进行的是段内短转移

Ø  8位位移的范围是:-127 ~ 12,用补码表示

Ø  8位位移由编译器在编译时算出。

  • Jmp near ptr 标号

Ø  16位位移=“标号”处的地址-jmp指令后的第一个字节的地址

Ø  Near ptr指明此处的位移为16位位移,进行的是段内近转移

Ø  16位位移的范围是:-32769 ~ 32767,用补码表示

Ø  16位位移由编译器在编译时算出。

  • Jmp far ptr 标号

Ø  实现的是段间转移,又称为远转移。

Ø  Far ptr指明了指令用标号的段地址和偏移地址修改CS和IP。

  • Jmp word ptr 内存单元地址(段内转移)

Ø  内存单元地址开始处存放着一个字,是转移的目的地址。

Ø  内存单元地址可用寻址方式的任一格式给出。

  • Jmp dword ptr 内存单元地址(段间转移)

Ø  从内存单元地址处开始存放着两个字(四字节),高地址处的字是转移的目的段地址,低地址处是转移的母的偏移地址。

(CS) =  (内存单元地址+2)

(IP) =  (内存单元地址)

Ø  内存单元地址可用寻址方式的任一格式给出。

  • Jcxz指令为有条件转移指令,所有的有条件转移指令都是短转移,在对应的机器码中包含转移的位移,而不是目的地址。对IP的修改范围都为-128 ~ 127。

Ø  指令格式:jcxz 标号(如果(CX) = 0,则转移到标号处执行)

Ø  当(cx)= 0时,(IP)=(IP)+ 8位位移

  • Ret指令用栈中的数据,修改IP的内容,从而实现近转移!

Ø  CPU执行ret指令时,进行下面两步操作:

(1)(IP) = ((SS) * 16 + (SP))

(2)(SP) = (SP) +2

  • Retf指令用栈中的数据,修改CS和IP的内容,从而实现远转移

Ø  CPU执行retf指令时,进行下面两步操作:

(1)     (IP) = ((SS) * 16 + (SP))

  (SP) = (SP) + 2

(2)    (CS) = ((SS) * 16 + (SP))

  (SP) = (SP) + 2

  • Call指令经常跟ret指令配合使用。

Ø  一次CPU执行call指令,进行如下两步操作:

(1)将当前的IP或CS和IP压入栈中;

(2)转移(jmp)

Ø  Call指令不能实现短转移,除此之外,call指令实现转移的方法和jmp指令的原理相同。

Ø  Call 标号(将当前的IP压栈后,转移到标号处执行指令.)。

Ø  CPU执行此种格式的call指令时,进行如下的操作:

(1)(SP) = (SP) – 2

           ((SS) * 16 + (SP)) = (IP)

(2)(IP) = (IP) + 16位位移

²  16位位移 = “标号”处地址 – call指令后的第一个字节的地址;

²  16位位移的范围为-32768 ~ 32767,用补码表示;

²  16位位移由编译器在编译时算出。

  • Call far ptr 标号指令的操作:

Ø  (1) (SP) = (SP) – 2

  ((SS) * 16 + (SP)) = (CS)

  (SP) = (SP) – 2

  ((SS) * 16 + (SP)) = (IP)

                   (2)(CS) = 标号所在的段地址

                (IP) = 标号所在的偏移地址

  • Call 16位寄存器

Ø  操作过程:

(SP) = (SP) – 2

((SS) * 16 + (SP)) = (IP)

(IP) = (16位寄存器)

  • 转移地址在内存中的call指令格式:

Ø  (1)call word ptr内存单元地址

  call dword ptr内存单元地址

  • Mul乘法指令,若乘数位8位则乘积默认保存在AX中,若乘数位16位在乘积保存在DX和AX中。

  • Int():描述性运算符,取商,例如:int(38/10) = 3

  • Rem():描述性运算符,取余数,例如:rem(38/10) = 8

  • 标志寄存器:

Ø  ZF零标志位(第6位)-à运算结果为零,则此位为1

Ø  PF奇偶标志位(第2位)---à运算结果中含1的个数是偶数,则此位为1

Ø  SF符号标志位(第7位)---à运算结果为负,则此位为1

Ø  CF进位标志位(第0位)--à无符号数运算若产生进位或借位,则此位为1

Ø  OF溢出标志位(第1位)--à有符号数运算若产生溢出,则此位为1

Ø  DF方向标志位(第10位)àDF = 0每次操作后si,di递增;DF = 1每次操作后si,di递减

  • Adc 操作对象1,操作对象2    是带进位加法指令

Ø  功能:操作对象1 = 操作对象1 + 操作对象2 +CF

  • Sbb 操作对象1,操作对象2     是带借位的减法指令

Ø  功能:操作对象1 = 操作对象1 – 操作对象2 – CF

  • Cmp指令

Ø  格式:cmp操作对象1,操作对象2

Ø  功能:计算操作对象1 – 操作对象2但并不保存结果,仅仅根据计算结果对标志寄存器进行设置。

  • 检测比较结果的条件转移指令

Ø  条件转移指令小结

指令

含义

检测的相关标志位

Je

等于则转移

ZF = 1

Jne

不等于则转移

ZF = 0

Jb

低于则转移

CF = 1

Jnb

不低于则转移

CF = 0

Ja

高于则转移

CF = 0, ZF = 0

Jna

不高于则转移

CF = 1或ZF = 1

  • Movsb指令

Ø  功能:(以字节为单位传送)

(1)((ES) * 16 + (DI)) = ((DS) *16 +(SI))

(2)如果DF = 0,则:(si) = (si) + 1

                             (di) = (di) + 1

如果DF = 1,则:(si) = (si) – 1

                                (di) = (di) – 1

  • Movsw指令

Ø  功能:(以字为单位传送)

(1)((ES) * 16 + (DI)) = ((DS) * 16 + (SI))

(2)如果DF = 0,则:(si) = (si) + 2

                             (di) = (di) + 2

          如果DF = 1,则:(si) = (si) – 2

                             (di) = (di) – 2

Ø  Movsb和movsw一般都是和rep指令配合使用的。

²  格式:rep movsbrepmovsw

²  Rep的作用是根据cx的值,重复执行后面的串传送指令

  • cld指令:将标志寄存器的DF位设置为0

  • std指令:将标志寄存器的DF位设置为1

  • pushf指令:将标志寄存器的值压栈

  • popf指令:从栈中弹出数据送入标志寄存器中

  • 8086CPU中断过程

Ø  (1)取得中断类型码N

     (2)pushf  ==========è 将标志寄存器的值压入栈中,保护标志寄存器中的数据

     (3)TF = 0,IF = 0  ===è 设置标志寄存器的第8位TF和第9位IF设置为0

     (4)push CS  ========è 将此处的代码段的段地址压入栈中

     (5)push IP  ========è 将此处的代码段的偏移地址压入栈中

     (6)(IP)= (N * 4) , (CS) = (N * 4 + 2)  è根据中断类型码计算中断处理程序的入口地址

  • Iret指令通常和硬件自动完成的中断过程配合使用

Ø  Iret功能描述(汇编语言描述):    pop IP

pop CS

popf

Ø  Iret的出栈顺序:IP、CS、标志寄存器

  • 汇编编译器是识别“+”、“-”、“*”、“/”的

Ø  Mov ax, (5 + 3) * 5 / 10就等效于mov ax, 4

  • 中断向量表

Ø  中断向量表存储在内存中的0 ~3FFh(即0 ~ 1023,这1024个字节空间中)的内存中

Ø  在中断向量表中,每4个字节确定一个中断类型

Ø  每个中断类型都有一个中断类型码,用来唯一标示该中断类型

Ø  每个中断类型的4个字节指向中断处理程序的入口地址,其中前2个字节用来存储中断处理程序的偏移地址(即IP),后2个字节用来存储中断处理程序的段地址(即CS)

Ø  每个中断类型的4个字节的存储工作都是程序员通过代码来实现

  • 单步中断(中断类型码为1)

Ø  CPU在执行完一条指令之后,如果检测到标志寄存器的TF位为1,则产生单步中断,引发中断过程。

Ø  单步中断的中断类型码为1,他所引发的中断过程如下:

²  (1)取得中断类型码1

   (2)标志寄存器入栈,TF、IF设置为0

   (3)CS、IP入栈

   (4)(IP) = (1 * 4), (CS) = (1 * 4 + 2)   

  • Int指令

Ø  格式:int n     ====èn为中断类型码。它的功能是引发中断过程

Ø  CPU执行int n指令,相当于引发一个n号中断的中断过程,执行如下:

²  (1)取中断类型码n ;

   (2)标志寄存器入栈,IF = 0,TF = 0 ;

   (3)CS、IP入栈;

   (4)(IP) = (n * 4), (CS) = (n * 4 + 2)

 

 

16位汇编语言复习

转载自:http://blog.csdn.net/leocfyb/article/details/8565066

寄存器

reg寄存器

AH&AL=AX(accumulator):累加寄存器 

BH&BL=BX(base):基址寄存器 

CH&CL=CX(count):计数寄存器 

DH&DL=DX(data):数据寄存器 

SP(Stack Pointer):堆栈指针寄存器 

BP(Base Pointer):基址指针寄存器 

SI(Source Index):源变址寄存器 

DI(Destination Index):目的变址寄存器 

IP(Instruction Pointer):指令指针寄存器

sreg段寄存器

CS(Code Segment)代码段寄存器 

DS(Data Segment):数据段寄存器 

SS(Stack Segment):堆栈段寄存器 

ES(Extra Segment):附加段寄存


逻辑运算指令:

AND   与运算.
OR      或运算.
XOR   异或运算.
NOT   取反.
TEST  测试.(两操作数作与运算,仅修改标志位,不回送结果).
SHL    逻辑左移.
SAL    算术左移.(=SHL)
SHR    逻辑右移.
SAR    算术右移.(=SHR)
ROL    循环左移.
ROR    循环右移.
RCL    通过进位的循环左移.
RCR    通过进位的循环右移.

XOR指令对两个操作数执行。按位的逻辑异或运算:即相“异或”的两位不相同时,结果就是1;否则,“异或”的结果为0。XOR指令设置CF = OF = 0,根据结果设置SF、ZF和PF状态,而对AF未定义。XOR可用于求反某些位,而不影响其他位。要求求反的位同“1”异或,维持不变的位同“0”异或。XOR指令经常给寄存器清0,同时使CF也清0。

OR指令对两个操作数执行按位的逻辑或运算:即只要相“或”的两位有一位是1,结果就是1;否则,“或”的结果为0。OR指令可用于置位某些位,而不影响其他位。这时只需将要置1的位同“1”或,维持不变的位同“0”或即可。OR指令设置CF = OF = 0,根据结果设置SF、ZF和PF状态,而对AF未定义。

AND指令对两个操作数执行按位的逻辑与运算:即只有相“与”的两位都是1,结果才是1;否则,“与”的结果为0。AND指令设置CF = OF = 0,根据结果设置SF、ZF和PF状态,而对AF未定义。AND指令可用于复位某些位,但不影响其他位。这时只需将要置0的位同“0”与,而维持不变的位同“1”与就可以了。

NOT指令对操作数按位取反:即原来为0的位变成1,原来为1的位变成0。注意,NOT 指令不影响标志位。

TEST指令对两个操作数执行按位的逻辑与运算,但结果不回到目的操作数。TEST指令执行的操作与AND指令相同,但不保存执行结果,只根据结果来设置状态标志。TEST指令设置CF = OF = 0,根据结果设置SF、ZF和PF状态,而对AF未定义。TEST指令通常用于检测一些条件是否满足,但又不希望改变原操作数的情况。这条指令之后,一般都是条件转移指令,目的是利用测试条件转向不同的程序段。TEST指令用于测试某一(几)位是否(同时)为0或为1。


第一章 基础知识

1、汇编语言由3类指令组成 

    汇编指令:机器码的助记符,有对应机器码。 

    伪指令:没有对应机器码,由编译器执行,计算机并不执行 

    其他符号:如+-*/,由编译器识别,没有对应机器码 

2、一个CPU有n根地址线,则可以所这个CPU的地址线宽度为n,这样的CPU最多可以寻找2的n次方个内存单元。

3、1K=2^10B 1M=2^20B 1G=2^30B 

4、8086 CPU地址总线宽度为20,寻址范围为00000~FFFFF 

    00000~9FFFF 主存储器地址空间(RAM) 

    A0000~BFFFF 显存地址空间 

    C0000~FFFFF 各类ROM地址空间   


第二章 寄存器(CPU工作原理) 

1、16位结构描述了一个CPU具有下面几个方面的结构特性 运算器一次最多可以处理16位的数据 寄存器的最大宽度为16位 寄存器和运算器之间的通路为16位 

2、8086有20位地址总线,可以传送20位地址,达到1M的寻址能力。采用在内部用两个16位地址合成的方法来形成一个20位的物理地址 

3、物理地址 = 段地址 × 16 + 偏移地址 

4、在编程是可以根据需要,将若干地址连续的内存单元看作一个段,用段地址×16定位段的起始地址(基础地址),用偏移地址定位段中的内存单元。段地址×16必然是16的倍数,所以一个段的起始地址也一定是16的倍数;偏移地址位16位,16位地址的寻址能力为64KB,所以一个段的长度最大为64KB 

5、8086有四个段寄存器 CS、DS、SS、ES 

6、CS为代码段寄存器,IP为指令指针寄存器。任意时刻,设CS中内容为M、IP中内容为N,8086CPU从内存M×16+N读取一条指令执行 

7、不能用mov修改CS、IP,因为8086CPU没有提供这样功能,可用指令JMP 段地址:偏移地址。JMP 2AE3:3 JMP AX 修改IP   


第三章 寄存器(内存访问)

1、DS数据段寄存器。不能将数据直接送入段寄存器,所以『MOV DS, 1』不正确 

2、字在存储时要两个连续的内存单元,低位在低地址,高位在高地址 

3、[address]表示一个偏移地址为address的内存单元 

4、SS:SP指向栈顶元素 

5、PUSH AX:(1)SP = SP - 2;(2)AX送入SS:SP 

6、POP AX:(1)SS:SP送入AX;(2)SP = SP + 2 

7、PUSH/POP 寄存器 PUSH/POP 段寄存器 PUSH/POP 内存单元   


第四章 第1个程序 

1、可执行文件包含两部分:程序和数据,相关的描述信息 

2、程序加载后, ds中存放这程序所在内存区的段地址,这个内存区的偏移地址为0,策程序所在的内存区的地址为ds:0;这个内存区的前256个字节中存放的是PSP,dos用来和程序进行通信。从256字节处向后的空间存放的是程序


第五章 [BX]和loop指令 

1、[BX]表示一个内存单元,它的段地址在ds中,偏移地址在bx中。MOV AX,[BX] MOV AL,[BX] MOV [BX],AX ◎loop要进行两步操作,CX=CX-1;判断cx中值,不为零则转至标号处执行程序,为零则向下执行。 

2、masm将指令 mov ax,[0] 当作 mov ax,0 处理 解决方法可以为 mov bx,0 使用寄存器 mov ax,[bx] 或 mov ax,ds:[0] 直接给出段地址所在的段寄存器 

3、loop中不可使用 mov [cx],cx   


第六章 包含多个段的程序 

1、dw 定义字型数据 

2、end 标号 定义程序入口点 

3、定义多个段,同定义代码段相同。定义仅仅是为了程序阅读方便 

4、assume cs:code,ds:data,ss:stack是伪指令,将定义的具有一定用途的段和相关的寄存器联系起来 

5、对于段,如果数据占N个字节,则程序加载后实际占有空间为:(N/16+1)*16,N的16整数   


第七章 更灵活的定位内存地址的方法 

1、and 按位与 and al, 0EFh 

2、or 按位或 or al, 20h 

3、字母大小写转换: 

    大写(xx0x xxxx) and al, 0EFh 

    小写(xx1x xxxx) or al, 20h

4、mov ax,[200+bx] == mov ax,[bx+200] == mov ax,200[bx] == mov ax,[bx].200 段地址为ds,偏移地址为bx+200 

5、si和di示8086CPU中和bx功能相近的寄存器,si和di不能分成两个8位寄存器来使用 

6、一般来说,在需要暂存数据的时候,都应该使用栈   


第八章 数据处理的两个基本问题 

1、bx,si,di,bp 

      (1)在8086CPU中,只有这4个寄存器可以用在[...]中来进行内存单元的寻址 正确:mov ax,[bx]  mov ax,[bp] 错误:mov ax,[cx]    mov ax,[dx]    mov ax,[ax]   mov ax,[ds] 

      (2)在[...]中,这4个寄存器可以单个出现,或只能以四种组合出现:bx和si、bx和di、bp和si、bp和di 错误:mov ax,[bx+bp]     mov ax,[si+di] 

      (3)只要在[...]中使用寄存器bp,而指令中没有显性地给出段地址,段地址就默认在ss中 mov ax,[bp] ax=ss*16+bp(取地址值) 

2、在没有寄存器名存在的情况下,用操作符 X ptr 指明内存单元的长度,X在汇编指令中可以位word或byte:

    mov word ptr ds:[0],1

    add word ptr [bx]

    inc byte ptr ds:[2]

3、div,除法指令

      (1)除数8位     被除数16位   AX                                            商-AL   余数-AH

      (2)除数16位   被除数32位  DX->高16位   AX->低16位    商-AX  余数-DX

4、dd 伪指令,定义双字dword

5、dup 伪指令,用来进行数据的重复 

    db 3 dup (0) == db 0,0,0 

    db 3 dup (0,1,2) == db 0,1,2,0,1,2,0,1,2 

    db 3 dup ('ab','CD') == db 'abCDabCDabCD'  


第九章转移指令的原理

1、可以修改ip,或同时修改csip的指令统称为转移指令

2、8086CPU的转移行为有一下几类:

      只修改ip时,称为段内转移,如jmp ax

      同时修改csip时,称为段间转移,如jmp es:[dx]

   由于转移指令对ip的修改范围不同,段内转移又分为:短转移和近转移

      短转移ip的修改范围为 -128~127

      近转移ip的修改范围为 -32768~32767

       8086CPU的转移指令分为以下几类:

      无条件转移指令(如jmp

      条件转移指令

      循环指令(如loop

      过程

      中断

3、offset取得标号的偏移地址

4、jmp short标号实现段内短转移,对ip的修改范围为 -128~127对应机器码中包含转移的位移 EB地址

5、jmp near ptr标号实现段内近转移,对ip的修改范围为 -32768~32767对应机器码包含转移的位移

6、jmp far ptr标号实现段间转移对应机器码中高地址为段地址,低地址为偏移地址 EA偏移地址段地址

7、jmp word ptr内存单元地址(段内转移)

8、jmp dword ptr内存单元地址(段间转移)

     高地址存放目的段地址,低地址存放目的偏移地址

9、jcxz标号 cx0时跳转

     所有有条件跳转指令都是短转移,对ip的修改范围都为 -128~127

10、loop标号

     所有循环指令都是短转移,对ip修改范围都为 -128~127


80×25彩色字符显示模式显示缓冲区结构:

内存地址空间中,B8000h~BFFFFFh32KB的空间,为80×25彩色显示缓冲区。向这个地址写入数据,写入的内容将立即出现在显示器上。

80×25彩色字符模式下,显示器可以显示25行,每行80个字符,每个字符可以有256种属性。一个字符在缓冲区占两个字节,一屏内容共占4000个字节。显示缓冲区分8页,每页4KB,显示器可以显示任意一页的内容,一般显示第0页,即B8000h~B8F9Fh

在一行中,一个字符占两个字节的存储空间,低位字节存储字符的ASCII码,高位字节存储字符的属性,一行80字符,占160字节

属性字节的格式:

  7                6 5 4               3               2 1 0

BL(闪烁) RGB(背景) I(高亮) RGB(前景)

显示在 M N列的字符为 B800:[160*M + 2*N] 



第十章 callret指令

1、ret用栈中数据修改ip,实现近转移

        (ip) = ((ss) * 16 + (sp))

        (sp) = (sp) + 2

    相当于:

        POP ip

2、retf用栈中数据修改csip,实现远转移

    (ip) = ((ss) * 16 + (sp))

        (sp) = (sp) + 2

        (cs) = ((ss) * 16 + (sp))

        (sp) = (sp) + 2

    相当于:

        POP ip

        POP cs

3、call指令,call指令不能实现短转移,实现转移的方法和假名牌指令原理相同

    (1call标号,段内转移

  机器指令中没有转移的目的地址,而是相对于当前ip的转移位移(补码),相当于 1.push ip 2.jmp near ptr标号

    (2call far ptr 标号,段间转移

  机器指令中包含转移目的地址,相当于 1.push cs 2.push ip 3.jmp far ptr标号

    (3call 16位寄存器

  相当于 1.push ip 2.jmp 16位寄存器,机器指令不包含目的地址

  注意:1.push ip ip先变成call后第一个字节的偏移地址,然后入栈

4call word ptr内存地址

  相当于 1.push ip 2.jmp word ptr内存地址

5call dword ptr内存地址

  相当于 1.push cs 2.push ip 3.jmp dword ptr内存地址

  注意:2.push ip ip先变成call后第一个字节的偏移地址,然后入栈

6、mul指令,乘法 a× b

     (1)都是8位  AL

     (2)都是16位  AX

结果 (1)结果放在AX

         (2)结果高位在DX,低位在AX 



第十一章标志寄存器

1、  11     10     9     8        7     6     4     2       0

        OF    DF    IF   TF     SF   ZF  AF   PF    CF

       溢出 方向 中断 标志  符号 零 辅助 奇偶  进位     

2、ZF零标志位,如果运算结果为零,则 ZF=1

3、PF奇偶标志位,相关指令执行后,1的个数为偶数 PF=1

4、SF符号标志位,执行后,计算结果为负 SF=1

5、CF进位标志位,无符号加减发生最高有效位之外的进、接位时 CF=1

6、OF溢出标志位,有符号运算发生溢出时 CF=1

7、adc带进位加法,adc ax,bx == (ax)=(ax)+(bx)+CF

8、sbb带借位减法,sbb ax,bx == (ax)=(ax)-(bx)-CF

9、cmp比较指令,相当于减法,但是不保存结果,只影响标志寄存器

      cmp ax,bx

   无符号比较时:

      ax==bx     ZF=1

      ax ≠ bx      ZF=0

      ax < bx     CF=1

      ax > bx     CF=0 and ZF=0

      ax <= bx   CF=1 or ZF=1

      ax >= bx   CF=0

   有符号比较时(反向说明)cmp ah,bh

      ah >= bh   SF=0 and OF=0

      ah < bh     SF=0 and OF=1

      ah < bh     SF=1 and OF=0

      ah > bh     SF=1 and OF=1

10、无符号比较跳转指令

      je        ZF=1

      jne      ZF=0

      jb       CF=1

      jnb     CF=0

      ja       CF=0 and ZF=0

      jna     CF=1 or ZF=1

11、DF方向标志位,在串处理指令中,控制每次操作后si di的增减,DF=1操作后si di递减

    使用cld,std设置: cld, DF=0. std, DF=1

12、movsbds:si内存单元字节送入es:di

    相当于:

        mov es:[di], byte ptr ds:[si] ;8086指令

        DF=0: inc si, inc di

        DF=1: dec si, dec di

    类似的还有movsw,传送一个字

    一般使用格式为 rep movsb

    相当于 s:movsb, loop s,所以要在之前设置cx

        cld   DF置0

        std   DF置1

13、pushf将标志寄存器值入栈, popf将标志寄存器值出栈

14、标志寄存器在debug中的表示

                       OF    DF    IF    TF    SF     ZF   AF      PF    CF

值为1的标记    OV   DN                   NG    ZR             PE    CY

值为0的标记    NV   UP                    PL    NZ             PO   NC


第十二章内中断

1、中断类型码:

   除法错误:0

   单步执行:1

      int nn

2、中断向量表 0000:0000~0000:04001024个单元,N号中断偏移地址为4N,段地址为4N+2,高地址为段地址,低地址为偏移地址

3、中断处理过程:

       1.取得中断类型码 N

       2.pushf

       3.TF=0, IF=0

       4.push CS

       5.push IP

       6.IP=4N, CS=4N+2

4、中断处理程序的编写和子程序类似,常规步骤为:

       1.保存用到的寄存器

       2.处理中断

       3.恢复用到的寄存器

       4.iret返回(iret = pop ip, pop cs, popf 




第十四章端口

1、端口的读写只能用in(读入)和out(写入)

2、在inout指令中,只能使用axal来存放从端口中读入的数据或要发送到端口中的数据。访问8位端口时用al,访问16位端口时      用dx

      in al, 20h ;20h端口读入一个字节

      out 20h,al ;20h端口写入一个字节 


      mov dx, fffh ;端口号送入dx16位)

      in al, dx ;读入一个字节

      out dx, al ;写入一个字节 

你可能感兴趣的:(汇编语言(王爽)学习记录)