《汇编语言》读书笔记(第1~3章)

一、基础知识

1.汇编语言的组成

(1)汇编指令:机器码的助记符,有对应的机器码。
(2)伪指令:没有对应的机器码,由编译器执行,计算机并不执行。
(3)其他符号:如+、-、*、/等,由编译器识别,没有对应的机器码。

汇编语言的核心是汇编指令,它决定了汇编语言的特性。

2.存储器

CPU是计算机的核心部件,它控制整个计算机的运作并进行运算。要想让一个CPU工作,就必须向他提供指令和数据。指令和数据在存储器中存放,也就是我们平时所说的内存。

3.指令和数据

在内存或磁盘上,指令和数据没有任何区别,都是二进制信息。CPU在工作时,有时把信息看作指令,有时看作数据,为同样的信息赋予不同的意义。

4.存储单元

存储器被划分成若干个存储单元。电子计算机最小的信息单位是bit,8个bit组成一个Byte,即8个二进制位。微机存储器的容量是以字节位最小单位来计算的。对于拥有128个存储单元的存储器可以说,他的容量是128个字节。

5.CPU对寄存器的读写

必须和外部器件进行下面三类信息的交互。
(1)存储单元的地址(地址信息);
(2)器件的选择,读或写的命令(控制信息);
(3)读或写的数据(数据信息)。

计算机中专门有连接CPU和其他芯片的导线,称为总线。从物理上讲就是导线的集合,从逻辑上又分为地址总线,控制总线和数据总线。

地址总线的宽度决定了CPU的寻址能力;
数据总线的宽度决定了CPU与其他器件进行数据传送时的一次数据传送量;
控制总线的宽度决定了CPU对系统中其他器件的控制能力。

6.实验

1)关于debug
查看、修改寄存器的内容:R
查看内容:D
修改内容:E
将内容解释为及其支流和对于的汇编指令:U
执行CS:IP指向的内存单元处的指令:T
以汇编指令的形式向内存中写入指令:A
2)示例
(1)CS:IP指向变化。
在这里插入图片描述

(2)hello world
在这里插入图片描述

stack   segment stack
      db	200 dup(0)
stack  ends

data segment
      disp db 'Hello World!$'   
data ends

code segment
       assume cs:code,ds:data,ss:stack
main: mov ax,data
          mov ds,ax
          lea dx,disp
          mov ah,09h
           int 21h
          mov ah,4ch
          int 21h
code ends
          end main

(3)修改屏幕的显示
在这里插入图片描述

二、寄存器

一个典型的CPU由运算器、控制器、寄存器等器件构成,他们靠内部总线相连。在CPU中:
运算器进行信息处理;
寄存器进行信息存储;
控制器控制各种器件进行工作;
内部总线连接各种器件,在他们之间进行数据的传送。

1.8086CPU给出物理地址的方法

(1)提供两个16位地址,一个称为段地址,一个称为偏移地址;
(2)他们进入地址加法器,合并为一个20位的物理地址送入输入输出控制电路,再通过地址总线送到存储器;

地址加法器采用 物理地址=段地址*16+偏移地址的方法合成物理地址。

2.CS和IP

他们是8086CPU中最关键的两个寄存器,只是了CPU当前要读取指令的地址。CS位代码段寄存器,IP位指令指针寄存器。
在任意时刻,CPU将CS:IP指向的内容当作指令执行。

3.修改CS/IP的指令

需要使用如jmp等转移指令,而不能使用如mov的传送指令。

三、寄存器(内存访问)

1.内存中字的存储

1)对于8086CPU,用16位的寄存器来存储一个字。在内存中存储时,由于内存单位是字节单元(一个单元存放一个字节),则一个字需要两个内存单元来存放。
2)字单元的概念:存放一个字型数据(16位)的内存单元,由两个地址连续的内存单元组成。高地址内存单元存放字型数据的高位字节。

2.DS和[address]

1)DS寄存器,用来存放要访问数据的段地址。
[address]中的address表示偏移地址。
2)示例
读取10000H单元的内容,用如下的程序段进行:
mov bx,100H
mov ds,bx
mov al,[0]

a) [0]说明内存单元的偏移地址为0,他的段地址默认放在ds中,执行时会自动从ds中取出。
b) 8086CPU不支持将数据直接送入段寄存器,故需要用bx寄存器作为媒介。

3)将al中的数据送入10000H中
mov bx,1000h
mov ds,bx
mov [0],al

关键的区别在于最后一步,其余步骤类似

3.字的传送

在mov指令中给出16位的寄存器,就可以进行16位数据的传送。比如:
mov ax,1000h
mov ds,ax
mov ax,[0]

内存中的情况:

10000H23
10001H11

程序执行后
1000:0处存放的字型数据送入ax;
1000:1单元存放字型数据的高八位,送入ah;
1000:0单元存放字型数据的低八位,送入al;
故ax=1123H

4. mov、add、sub指令

1)指令的几种形式:
mov 段寄存器,寄存器;
mov 寄存器,段寄存器;
mov 内存单元,寄存器;
mov 段寄存器,内存单元;

以"mov 段寄存器,内存单元"为例,在Debug中进行验证:
(a)目标:将10000H处存放的字型数据送入ds;
(b)指令:在这里插入图片描述
(c)结果:
在这里插入图片描述
由图中可知,ds的数据发生了改变,从而验证该指令成立。
2)add,sub指令与mov一样,都有两个操作对象。
3)他们都不能对段寄存器进行操作。
以"add ds,ax"为例进行验证:
在这里插入图片描述

5.数据段

在编程时,可以将一组内存单元当作专门存储数据的内存空间,定义为一个数据段。这不过是在编程时的一种安排,在具体操作时,可以用ds存放数据段的段地址,再根据需要,用相关指令访问数据段中的具体单元。
例如:
在这里插入图片描述
在这里插入图片描述
需注意,一个字型数据占据两个单元,故偏移地址是0,2,4。

6.栈

(1)栈是存储空间,特殊性在于先进后出。

(2)在8086CPU中,有段寄存器SS和寄存器SP,栈顶的段地址存放在SS中,偏移地址存放在SP中。任意时刻,SS:SP指向栈顶元素。push指令和pop指令执行时,CPU从SS和SP中得到栈顶的地址。

(3)push ax的执行,由以下两部分完成。

a)SP=SP-2,SS:SP指向当前栈顶前面的单元,以当前栈顶前面的单元为新的栈顶;
b)将ax中的内容送入SS:SP指向的内存单元处,SS:SP指向新栈顶。

(4)pop ax的执行,由以下两部分完成

a)将SS:SP指向的内存单元处的数据送入ax中;
b)SP=SP+2,SS:SP指向当前栈顶下面的单元,以当前栈顶下面的单元为新的栈顶;

(5)当栈空时,SS:SP指向栈空间最高地址单元的下一个单元。
(6)栈顶超界的问题

  在栈满的时候使用push指令入栈,或栈空的时候再使用pop指令出栈,都会发生栈顶超界问题。 
   
  如果CPU中有记录栈顶上限和栈底的寄存器,可以通过填写这些寄存器来指定栈空间的范围。

(7)栈段
将一段内存当作栈段,仅仅是编程时的一种安排。CPU并不会由于这种安排,就在执行push、pop等栈操作指令时自动地将我们定义地栈段当作栈空间来访问,而是通过SS:SP指向我们定义的栈段。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值