《汇编语言》- 王爽 个人学习笔记

3.《汇编语言》-王爽第三版学习笔记 寄存器(内存访问)

2021-02-22  本文已影响0人  Nonmfly
  1. 内存中的字存储
  1. DS 和 [address]
mov bx,1000H
mov ds,bx
mov al,[0]
mov bx,1000H
mov ds,bx
mov [0],al
  1. 字的传送
    8086CPU是16位结构,有16根数据线,可以一次传送16位的数据(一个字),所以只要在mov指令中给出16位的寄存器就可以进行16位数据的传送了。

  2. mov add sub指令

mov  寄存器,数据     // mov ax,8
mov  寄存器,寄存器     // mov ax,bx
mov  寄存器,内存单元     // mov ax,[0]
mov  内存单元,寄存器     // mov [0],ax
mov  段寄存器,寄存器     // mov ds,ax
mov 寄存器, 段寄存器     // mov ax, ds
mov 内存单元, 段寄存器     // mov [0], ds
mov 段寄存器, 内存单元     // mov ds, [0]
add  寄存器,数据     // add ax,8
add  寄存器,寄存器     // add ax,bx
add  寄存器,内存单元     // add ax,[0]
add  内存单元,寄存器     // add [0],ax
sub  寄存器,数据     // sub ax,8
sub  寄存器,寄存器     // sub ax,bx
sub  寄存器,内存单元     // sub ax,[0]
sub  内存单元,寄存器     // sub [0],ax
  1. 数据段
    编程时的一种安排,将一组长度为N(N<=64KB),地址连续,起始地址为16倍数的内存单元当作专门存储数据的内存空间。
mov ax,123BH
mov ds,ax
mov al,0
add al,[0]
add al,[1]
add al,[2]

(2)累加这个数据段中的前3个字型数据

mov ax,123BH
mov ds,ax
mov ax,0
add ax,[0]
add ax,[2]
add ax,[4]
(1)在Debug中, 用 "d 0:0 1f" 查看内存,结果如下:
0000:0000 70 80 F0 30 EF 60 30 E2-00 80 80 12 66 20 22 60
0000:0010 62 26 E6 D6 CC 2E 3C 3B-AB BA 00 00 26 06 66 88
下面的程序执行前, AX = 0, BX = 0, 写出相关寄存器中的值
mov ax 1
mov ds ax         // ds = 1
mov ax,[0000]   // AX = 2662H
mov bx,[0001]   // BX = E626H
mov ax,bx         // AX = E626H
mov ax,[0000]   // AX = 2662H
mov bx,[0002]   // BX = D6E6H
add ax,bx          // AX = FD48H
add ax,[0004]   // AX = 2C14H
mov ax,0          // AX = 0H
mov al,[0002]   // AX = 00E6H
mov bx,0          // BX = 0H
mov bl,[000C]   // BX = 0026H
add al,bl           // AX = 000CH
AF017D58-B4BA-4B5C-9652-BE2D971EA324.png
执行指令如下:
mov ax,6622H
jmp 0ff0:0100
mov ax,2000H
mov ds,ax
mov ax,[0008]
mov ax,[0002]
15C2843E-C084-4C73-9C72-449BAFB398F5.png

  1. 一种数据结构。操作规则 LIFO(Last In First Out 后进先出)

7.CPU提供的栈机制

PUSH ax  // 表示将寄存器ax中的数据送入栈中
POP ax  //表示取出栈顶数据存入寄存器ax中
  1. 栈顶超界问题
    8086CPU只知道栈顶在何处(由SS:SP知识),而不知道安排的栈空间有多大,所以在编程的时候自己操作,根据可能用到的最大空间来安排栈的大小,执行出栈入栈的时候要注意可能导致栈超界问题。

9.PUSH POP指令

push 寄存器    //将一个寄存器中的数据入栈
pop 寄存器    //出栈,用一个寄存器中接受出栈的数据
push 段寄存器    //将一个段寄存器中的数据入栈
pop 段寄存器    //出栈,用一个段寄存器中接受出栈的数据
push 内存单元    //将一个内存单元中的字入栈(注意:战的操作以字为单位)
pop 内存单元  //出栈,用一个内存字单元接受出栈的数据
栈的综述:
(1)8086CPU提供了栈操作机制,方案如下:
在SS,SP中存放栈顶的段地址和偏移地址
提供入栈出栈指令,它们根据SS:SP指示的地址,按照栈的方向访问内存单元
(2)push指令执行的操作步骤:1.SP=SP-2; 2.向SS:SP指向的字单元中送入数据
(3)pop指令执行的操作步骤:1.从SS:SP指向的字单元中读取数据;2.SP=SP+2
(4)任意时刻,SS:SP 指向栈顶元素
(5)8086CPU只记录栈顶,栈空间的大小我们要自己管理
(6)PUSH POP实质上是一种内存传送指令
  1. 栈段
上一篇下一篇

猜你喜欢

热点阅读