《汇编语言-王爽》 读书笔记
来源:互联网 发布:西安长城宽带网络 编辑:程序博客网 时间:2024/05/16 19:25
第一章:基础知识
1.1.汇编指令和机器指令
汇编语言的主体是汇编指令,汇编指令和机器指令的差别在于指令的表示方法上,汇编指令是极其指令便于记忆的书写格式.
机器指令 1000100111011000表示把寄存器BX的内容送到AX中。汇编指令则写成mov ax, bx。在汇编指令和机器码之间有一个编译器起到一个转换的作用。
1.2.汇编指令的组成
(1)汇编指令:汇编码的助记符,有对应的机器码
(2)伪指令:没有对应的机器码,由编译器执行。计算机并不执行
(3)其它符号:+,-,*,/。由编译器识别,没有对应的机器码。
1.3.存储单元
一个存储器被划分成多个存储单元。一个byte是8bit,一个存储单元是可以存储一个byte的。
1.4.cup对存储器的读写
cup访问存储器,首先要确定是访问那个单元(地址信息)。然后是确定对这个单元进行那种操作,是读,还是写(控制信息)。然后才能真正的读数据或写数据(数据信息)。这三种信息就是cup和内存之间的信息交互。
1.5地址总线
Cup通过地址总线来寻址,如果有10根地址总线,每根地址总线都有0和1两种状态,那么可以寻址多少个存储单元,2的10次方。(1023个存储单元,1k)
如图:cup寻找15这个存储单元的实际过程
1.6数据总线
8根数据总线一次可以传送8 bit。16根数据总线一次可以传送16bit即2个byte。
1.7存储器
Cup不能直接操作外围设备如显示器,打印机而是操作相应的显卡,网卡。他们插在主板上的扩充插槽里,扩充插槽通过总线和cup相连接。从而实现了cup对外围设备的间接控制。
PC中的各种存储器情况:
第二章 寄存器
一个典型的cup由寄存器,控制器和运算器等器件组成,这些器件又总线(内部总线,区别上一章将的外部总线)相连。在cup内部
寄存器用于存放指令和数据
控制器用于控制各个器件进行工作
运算器用于信息处理
2.1通用寄存器 (AX,BX,CX,DX)都是16位的寄存器
4个16位通用寄存器又可分配成两个独立的寄存器:
AX可分为:AH和AL
BX可分为: BH和BL
CX可分为: CH和CL
SX可分为: SH和DL
在cup可以一次处理两种数据类型
Byte和word
Byte是8位正好可以存储在8位寄存器中。
Word是16位的分为高位和低位,(以AX为例)分别放入AL和AH中
2.2 8086cpu给出物理地址的方法
8086cpu有20位的地址总线,可以选址1MB的存储单元,但是8086cpu是16位结构,在内部一次性处理,传输,暂时存储为16位,那么其内部职能寻址64KB的存储单元
8086cpu采用一种内部用两个16位地址合并的方法来形成一个20位的物理地址
地址加法器采用 物理地址 =段地址(Segment)×16 +偏移地址(offset):cup访问内存是,用一个基础地址(段地址×16)和一个相对基础地址的偏移地址相加,最后得到物理地址。
比如:cup要访问12348H的内存地址,那么首先把段地址1230H ,和偏移地址0048H输入加法器。1230H×16=12300H,然后加上0048H = 12348H.
地址加法器的运算过程:
一个X制进的数据左移一位,相对于乘以X.
段地址:把若干连续的地址看做是一个段,比如:10000H~100FFH。注意段地址的宽度是16位,所 以最大的寻址地址64K。
物理地址 段地址 偏移地址
21F60H 2000H 1F60H
2100H 0F69H
结论:一个物理地址可以由不同的偏移地址和段地址构成;
SA = SA×16 + OA;
2.3段寄存器
上面运算器,在获得段地址和偏移地址的时候是由其它的部件提供的,那么是由那个部件提供的呢?在cup里面有段寄存器(CS,DS,SS,ES);
一个重要的cs+ip cs为代码段寄存器,存放要访问代码段的段地址。Ip为指令指针寄存器。他们指示了cup当前要读取指令的偏移地址,在cup加点启动或复位后(cpu刚开始工作的时候)cs和ip被指示为:FFFFH,ip被指示为:0000H。cup在刚启动时,cup从内存FFF0H单元里面读取指令执行。FFF0H单元是cpu执行的第一条指令。内存里面的数据cup有的是看作指令,有的是看作数据。都是二进制数据,那么cup什么时候看作指令,什么时候看作数据。我们可以说,cup把cs:ip指向的内存单元里面数据看作指令,然后读取执行。如果说内存里面的那段信息被cup执行过,那么他们所在的内存必然被cs:ip指向过。
2.4修改cs,ip的指令 jmp
Jmp段地址:偏移地址来修改cup中cs:ip的值
Jmp 2AE3:3执行后:cs=2AE3H,ip=0003H cpu将从2AE3H处读取指令
如果只要修改ip
这 jmp某一个合法寄存器
Jmp ax等价于 jmp ip, ax;
2.5代码段
在内存中一段连续的地址,称为段。在这个段里面存放的都是指令。我们称之为代码段。如何让cup来执行这段的指令,就必须要cs:ip指向所定义的代码段中的第一个指令的首地址。
第三章 寄存器(内存访问)
从内存的角度分析几个寄存器
3.1 在内存中,都是字节单元,是一个字占用两个字节,所以在内存中使用两个内存单元来存储。
20H
4EH
12H
00H
4E20H这个字存储在0号单元,低字节存储在低位,高字节存储在高位
Cpu中有一个ds寄存器专门用来存放要访问的数据段的段地址(cs是专门用来访问代码段的段地址)。
Move ax,1000H //把数据段段地址放入 ax
Move ds,ax; //再放入ds
Move al,[0]
这段代码就是把1000:0这个内存单元的数据读到al里面,反过来,如果要把al里面的数据读到内存里面去 move [0] ,al
Move既可以把内存数据直接放入寄存器,也可以把寄存器里面的数据放到另外一个寄存器里面。
[]表示内存单元的偏移地址。Move al,[0] 会自动从ds中取段地址,然后加上0偏移地址,组后得到物理地址。
那么 为什么不直接把数据段段地址1000h直接放入ds呢,因为,ds是数据段寄存器,不能直接将数据1000H直接放入ds ,只能通过通用寄存器来做中转。
3.2堆栈
偶尔我们把一段内存当作堆栈来使用,我们称之为栈段(一段连续的内存<=64KB)。
Cup如何把一段内存当作栈段,cup如何从栈顶访问数据,栈顶单元是如何确定的。
这就要用到 SS:SP就好象CS:IP是访问代码段一样,任意时刻SS:SP都指向栈顶元素
push pop指令执行时,cpu从SS和SP中得到栈顶的地址。
push ax指令
1.sp = sp – 2 SS:SP指向新的栈顶。
2.将ax里的数据放入堆栈。
这两部分,如果是pop ax正好是相反的,先是取出数据,然后修改sp
Cpu入栈时,栈顶地址从高地址向高地址方向增长。
Push和pop可以在访问的内存单元和寄存器之间传送数据,于move不同的是,push要访问的内存单元地址不是在指令中给出,而是由ES:SP指出。同时还要改变sp的值。
第一个汇编程序
(1) 标号:汇编源程序中,除了汇编指令和伪指令之外,还有一些标号如:codesg。一个标号指代一个地址比如codesg在segment前面作为一个段的名称。这个段的名称最终将编译、连接程序处理成一个段的段地址。
assume cs:abc //abc当作代码段来使用
abc segement
move ax,2;
adb ends //段结束标志
end //程序结束标志
(2) 程序返回
一个程序结束,将把cup的控制权给使这个程序得以运行的程序。使之继续执行。这个过程就是程序返回
move ax,4c00H;
int 21H;
(2)loop
Lopp指令格式
Loop标号
Cup执行loop指令时需要做两件事
a.cx =cx -1
b.判断cx是否为0不为0转到标号处执行程序,如果为0继续执行;
00 01 10 11 100 101 110 111
10
010
011
实现程序 2*11
assume cs:code
code segment
mov ax,2
mov cx,11
s: add ax,ax
loop s
mov ax,4c00h
int 21h
code ends
end
s:是一个标号,代表内存里面的一段指令。只要cx不为0则一直执行标号所在处内存里面的指令。既add ax,ax
- 《汇编语言》(王爽)读书笔记
- 《汇编语言-王爽》 读书笔记
- 王爽 《汇编语言》 读书笔记 十七
- 王爽 《汇编语言》 读书笔记 一 基础知识
- 王爽 《汇编语言》 读书笔记 二 寄存器
- 王爽 《汇编语言》 读书笔记 十四 端口
- 《汇编语言》-王爽-第三版-读书笔记-前言
- 王爽 《汇编语言》 读书笔记 四 第一个程序
- 王爽 《汇编语言》 读书笔记 十一 标志寄存器
- 王爽 《汇编语言》 读书笔记 十二 内中断
- 王爽 《汇编语言》 读书笔记 十三 int指令
- 王爽 《汇编语言》 读书笔记 十五 外中断
- 王爽 《汇编语言》 读书笔记 十六 直接定址表
- 汇编语言程序设计读书笔记
- 汇编语言 读书笔记 第一章
- 汇编语言读书笔记 第二章
- 《王爽汇编语言》读书笔记
- 【读书笔记】汇编语言程序设计
- 编程思想
- HWDBTestCase
- linux 下 gbk字符集mysql 安装 数据的导入
- auto5
- Symbian开发入门教程
- 《汇编语言-王爽》 读书笔记
- JQuery中的API--操作DOM
- 为Ruby的编辑器SciTE更改中文菜单
- 无限级分类的实现
- HWDBTestCase2
- SQL小总结
- 作为应聘者 面试结束时应该问面试官一些什么问题呢?
- C++用C程序的一个链接错误
- HWDBTestCase3