《汇编语言》学习笔记_第1页
《汇编语言》学习笔记_第2页
《汇编语言》学习笔记_第3页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、清华大学汇编语言(王爽)读书笔记第一章 基础知识汇编语言由 3 类指令组成 汇编指令:机器码的助记符,有对应机器码。 伪指令:没有对应机器码,由编译器执行,计算机并不执行 其他符号:如 +-*/ ,由编译器识别,没有对应机器码一个 CPU 有 n 根地址线,则可以所这个 CPU 的地址线宽度为 n ,这样的 CPU 最多可以寻找 2 的 n 次方个内存单元。 1K=2A10B 1M=2A20B 1G=2A30B 8086 CPU 地址总线宽度为 20 ,寻址范围为 00000FFFFF 000009FFFF 主存储器地址空间 (RAM)A0000BFFFF 显存地址空间 C0000FFFFF

2、各类 ROM 地址空间第二章 寄存器( CPU 工作原理) 16 位结构描述了一个 CPU 具有下面几个方面的结构特性 运算器一次最多可以处理 16 位的数据寄存器的最大宽度为 16 位 寄存器和运算器之间的通路为 16 位 8086 有 20 位地址总线,可以传送 20 位地址,达到 1M 的寻址能力。采用在内部用两个 16 位地址 合成的方法来形成一个 20 位的物理地址物理地址=段地址 X 16 + 偏移地址在编程是可以根据需要,将若干地址连续的内存单元看作一个段,用段地址X16定位段的起始地址(基础地址),用偏移地址定位段中的内存单元。段地址 X16 必然是 16 的倍数,所以一个段的

3、起始地 址也一定是 16 的倍数;偏移地址位 16 位, 16 位地址的寻址能力为 64KB ,所以一个段的长度最大为 64KB8086 有四个段寄存器 CS 、DS 、SS、ESCS 为代码段寄存器, IP 为指令指针寄存器。任意时刻,设 CS 中内容为 M、IP 中内容为 N, 8086CPU 从内存 MX 16+N 读取一条指令执行不能用 mov 修改 CS、IP ,因为 8086CPU 没有提供这样功能,可用指令 JMP 段地址 :偏移地址。 JMP 2AE3:3 JMP AX 修改 IP第三章 寄存器(内存访问)DS 数据段寄存器。不能将数据直接送入段寄存器,所以MOV DS, 1

4、不正确字在存储时要两个连续的内存单元,低位在低地址,高位在高地址 address 表示一个偏移地址为 address 的内存单元 SS:SP 指向栈顶元素 PUSH AX :(1 ) SP = SP - 2;( 2 ) AX 送入 SS:SPPOP AX:(1) SS:SP 送入 AX;(2) SP = SP + 2 PUSH/POP 寄存器 PUSH/POP 段寄存器 PUSH/POP 内存单元第四章 第 1 个程序 可执行文件包含两部分:程序和数据,相关的描述信息 程序加载后, ds 中存放这程序所在内存区的段地址,这个内存区的偏移地址为 0,策程序所在的内 存区的地址为 ds:0 ;这个

5、内存区的前 256 个字节中存放的是 PSP, dos 用来和程序进行通信。从 256 字节处向后的空间存放的是程序。第五章 BX 和 loop 指令 BX表示一个内存单元,它的段地址在 ds中,偏移地址在bx中。MOV AX,BX MOV AL,BXMOV BX,AXloop 要进行两步操作, CX=CX-1 ;判断 cx 中值,不为零则转至标号处执行程序,为零则向下执 行。 masm 将指令 mov ax,0 当作 mov ax,0 处理解决方法可以为 mov bx,0 使用寄存器 mov ax,bx或 mov ax,ds:0直接给出段地址所在的段寄存器 loop 中不可使用 mov cx

6、,cx第六章 包含多个段的程序dw 定义字型数据 end 标号 定义程序入口点定义多个段,同定义代码段相同。定义仅仅是为了程序阅读方便 assume cs:code,ds:data,ss:stack是伪指令,将定义的具有一定用途的段和相关的寄存器联系起来对于段,如果数据占 N 个字节,则程序加载后实际占有空间为: (N/16+1)*16 ,N 的 16 整数第七章 更灵活的定位内存地址的方法 and 按位与 and al, 0EFh or 按位或 or al, 20h字母大小写转换:大写( xx0x xxxx ) and al, 0EFh小写( xx1x xxxx ) or al, 20h m

7、ov ax,200+bx = mov ax,bx+200 = mov ax,200bx = mov ax,bx.200段地址为 ds ,偏移地址为 bx+200 si 和 di 示 8086CPU 中和 bx 功能相近的寄存器, si 和 di 不能分成两个 8 位寄存器来使用 一般来说,在需要暂存数据的时候,都应该使用栈第八章 数据处理的两个基本问题bx,si,di,bp1 。在 8086CPU 中,只有这 4 个寄存器可以用在 . 中来进行内存单元的寻址正确: mov ax,bx | mov ax,bp错误: mov ax,cx | mov ax,dx | mov ax,ax | mov

8、ax,ds2 。在. 中,这 4 个寄存器可以单个出现,或只能以四种组合出现: bx 和 si、bx 和 di、bp 和 si、 bp 和 di错误: mov ax,bx+bp | mov ax,si+di3 。只要在. 中使用寄存器 bp ,而指令中没有显性地给出段地址,段地址就默认在 ss 中 mov ax,bp ax=ss*16+bp(取地址值)在没有寄存器名存在的情况下,用操作符 X ptr 指明内存单元的长度, X 在汇编指令中可以位 word 或 byte :mov word ptr ds:0,1 | add word ptr bx,2 | inc byte ptr ds:2div

9、 ,除法指令 div 除数除数 8 位 16 位被除数 AX DX-> 高 16 位 AX-> 低 16 位商 AL AX余数 AH DX dd 伪指令,定义双字 dword dup 伪指令,用来进行数据的重复db 3 dup (0) = db 0,0,0db 3 dup (0,1,2) = db 0,1,2,0,1,2,0,1,2db 3 dup ('ab','CD') = db 'abCDabCDabCD'第九章 转移指令的原理可以修改 ip ,或同时修改 cs 和 ip 的指令统称为转移指令 8086CPU 的转移行为有一下几类

10、: 只修改 ip 时,称为段内转移,如 jmp ax 同时修改 cs 和 ip 时,称为段间转移,如 jmp es:dx 由于转移指令对 ip 的修改范围不同,段内转移又分为:短转移和近转移 短转移 ip 的修改范围为 -128127近转移 ip 的修改范围为 -32768327678086CPU 的转移指令分为以下几类: 无条件转移指令(如 jmp ) 条件转移指令循环指令(如 loop )过程中断 offset 取得标号的偏移地址 jmp short 标号 实现段内短转移,对 ip 的修改范围为 -128127 对应机器码中包含转移的位移 EB 地址 jmp near ptr标号 实现段内

11、近转移,对 ip 的修改范围为 -3276832767 对应机器码包含转移的位移 jmp far ptr标号 实现段间转移 对应机器码中高地址为段地址,低地址为偏移地址 EA 偏移地址段地址 jmp word ptr内存单元地址(段内转移) jmp dword ptr内存单元地址(段间转移)高地址存放目的段地址,低地址存放目的偏移地址 jcxz 标号 cx 为 0 时跳转 所有有条件跳转指令都是短转移,对 ip 的修改范围都为 -128127 loop 标号 所有循环指令都是短转移,对 ip 修改范围都为 -128127 80 X 25彩色字符显示模式显示缓冲区结构:内存地址空间中,B8000

12、hBFFFFFh 共32KB的空间,为80X 25彩色显示缓冲区。向这个地址写入 数据,写入的内容将立即出现在显示器上。在 80X 25 彩色字符模式下,显示器可以显示 25 行,每行 80 个字符,每个字符可以有 256 种属性。 一个字符在缓冲区占两个字节,一屏内容共占4000个字节。显示缓冲区分8页,每页4KB,显示器可以显示任意一页的内容,一般显示第 0 页,即 B8000hB8F9Fh。在一行中,一个字符占两个字节的存储空间,低位字节存储字符的 ASCII 码,高位字节存储字符的属 性,一行 80 字符,占 160 字节属性字节的格式:7 6 5 4 3 2 1 0BL_(闪烁)RG

13、B (背景)I RGB (前景)显示在 M 行 N 列的字符为 B800:160*M + 2*N第十章 call 和 ret 指令 ret 用栈中数据修改 ip ,实现近转移(ip) = (ss) * 16 + (sp)(sp) = (sp) + 2相当于:POP ip retf 用栈中数据修改 cs 和 ip ,实现远转移(ip) = (ss) * 16 + (sp)(sp) = (sp) + 2(cs) = (ss) * 16 + (sp)(sp) = (sp) + 2 相当于:POP ipPOP cscall 指令, call 指令不能实现短转移,实现转移的方法和假名牌指令原理相同1 。

14、 call 标号,段内转移机器指令中没有转移的目的地址,而是相对于当前 ip 的转移位移(补码),相当于 1.push ip 2.jmp near ptr 标号2 。 call far ptr 标号,段间转移 机器指令中包含转移目的地址,相当于 1.push cs 2.push ip 3.jmp far ptr 标号3。call 16位寄存器相当于 1.push ip 2.jmp 16 位寄存器,机器指令不包含目的地址注意: 1.push ip ip 先变成 call 后第一个字节的偏移地址,然后入栈4 。 call word ptr 内存地址相当于 1.push ip 2.jmp word

15、ptr 内存地址5 。 call dword ptr 内存地址相当于 1.push cs 2.push ip 3.jmp dword ptr内存地址注意: 2.push ip ip 先变成 call 后第一个字节的偏移地址,然后入栈 mul指令,乘法a xba 8 位 16 位b AL AX结果 AX 高位 DX, 低位 AX第十一章 标志寄存器 11 10 9 8 7 6 4 2 0OF DF IF TF SF ZF AF PF CF ZF 零标志位,如果运算结果为零,则 ZF=1 PF 奇偶标志位,相关指令执行后, 1 的个数为偶数 PF=1 SF 符号标志位,执行后,计算结果为负 SF=

16、1 CF 进位标志位,无符号加减发生最高有效位之外的进、接位时 CF=1 OF 溢出标志位,有符号运算发生溢出时 CF=1 adc 带进位加法, adc ax,bx = (ax)=(ax)+(bx)+CF sbb 带借位减法, sbb ax,bx = (ax)=(ax)-(bx)-CF cmp 比较指令,相当于减法,但是不保存结果,只影响标志寄存器cmp ax,bx无符号比较时:ax=bx, ZF=1ax<>bx, ZF=0ax< bx, CF=1ax> bx, CF=0 and ZF=0ax<=bx, CF=1 or ZF=1ax>=bx, CF=0 有符

17、号比较时(反向说明) cmp ah,bh :SF=0 and OF=0, ah>=bhSF=0 and OF=1, ah< bhSF=1 and OF=0, ah< bhSF=1 and OF=1, ah> bh无符号比较跳转指令je, ZF=1 jne, ZF=0jb, CF=1jnb, CF=0ja, CF=0 and ZF=0jna, CF=1 or ZF=1 DF 方向标志位,在串处理指令中,控制每次操作后 si di 的增减, DF=1 操作后 si di 递减 使用 cld,std 设置: cld, DF=0. std, DF=1 movsb 将 ds:si

18、 内存单元字节送入 es:di相当于:mov es:di, byte ptr ds:si ;非 8086 指令DF=0: inc si, inc diDF=1: dec si, dec di 类似的还有 movsw ,传送一个字 一般使用格式为 rep movsb相当于 s:movsb, loop s ,所以要在之前设置 cx pushf 将标志寄存器值入栈, popf 将标志寄存器值出栈标志寄存器在 debug 中的表示0 OV DN NG ZR PE CY1 NV UP PL NZ PO NCOF DF XX SF ZF XX PF CF第十二章 内中断中断类型码: 除法错误: 0 单步执

19、行: 1 int0 指令: 4 int n : n中断向量表 0000:00000000:03E8,1000 个单元, N 号中断偏移地址为 4N ,段地址为4N+2 ,高地址为段地址,低地址为偏移地址中断处理过程:1. 取得中断类型码 N2. pushf3. TF=0, IF=04. push CS5. push IP6.ip=4N, cs=4N+2 中断处理程序的编写和子程序类似,常规步骤为:1. 保存用到的寄存器2. 处理中断3. 恢复用到的寄存器4. 用 iret 返回( iret = pop ip, pop cs, popf)第十三章 int 指令 10 中断mov ah, 2 ;

20、置光标, 2 号子例程为设置光标位置mov bh, 0 ; 第 0 页mov dh, 5 ; 行号mov dl, 12 ; 列号int 10h mov ah, 9 ;9 号子例程为在光标位置显示字符mov al, 'a' 字符mov bl, 7 ; 颜色属性mov bh, 0 ; 第 0 页mov cx, 3 ; 字符重复个数int 10h第十四章 端口 端口的读写只能用 in (读入)和 out (写入)在 in 和 out 指令中,只能使用 ax 或 al 来存放从端口中读入的数据或要发送到端口中的数据。访问8 位端口时用 al ,访问 16 位端口时用 dxin al,

21、20h ; 从 20h 端口读入一个字节out 20h,al ; 向 20h 端口写入一个字节mov dx, 3F8h ; 端口号送入 dx ( 16 位)in al, dx ; 读入一个字节out dx, al ; 写入一个字节第十五章 外中断 PC 机键盘处理过程扫描码端口为 60h ,断码 = 通码 + 80h键盘输入到达 60h 端口时,相关芯片发送 9 号中断,如果这时 IF=1 ,则响应中断 BIOS 提供 int 9 中断例程,用来进行基本的键盘输入处理1. 读出 60h 端口中的扫描码2. 如果时字符键的扫描码,将扫描码对应的 ASCII 码送入内存中 BIOS 键盘缓冲区;如果是控制键,将 其转为状态字节写入 0040:17 单元BIOS 键盘缓冲区中,一个键盘输入用一个字单元存放,高位存放扫描码,低位存放 ASCII 码 状态字节含义:0

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论