首页 > 系统相关 >【汇编语言】第3章 寄存器(内存访问)

【汇编语言】第3章 寄存器(内存访问)

时间:2022-11-25 19:32:37浏览次数:42  
标签:汇编语言 SP mov 内存 寄存器 ax 单元


【汇编语言】第3章 寄存器(内存访问)

本文分为4个部分:

  1. 书本知识点概览
  2. 书本自带的小结
  3. 书本习题解析
  4. 个人小结

文章目录

  • ​​【汇编语言】第3章 寄存器(内存访问)​​
  • ​​知识点概览​​
  • ​​3.1 内存中字的存储​​
  • ​​3.2 DS 和 [address]​​
  • ​​3.3 字的传送​​
  • ​​3.4 mov,add,sub 指令​​
  • ​​3.5 数据段​​
  • ​​3.6 栈​​
  • ​​3.7 CPU提供的栈机制​​
  • ​​3.8 栈顶超界的问题​​
  • ​​3.9 push、pop指令​​
  • ​​3.10 栈段​​
  • ​​书本小结​​
  • ​​习题解析​​
  • ​​个人总结​​

知识点概览

3.1 内存中字的存储

CPU用16为寄存器来存储一个字。高8为存高位字节,低8位存放低位字节。一个字要两个内存单元来存储。

字单元,存放一个字型数据的内存单元,有两个地址连续的内存单元组成

起始地址位N的字单元称为N地址字单元
问题3.1

主要看清是字型数据还是字节型数据

【汇编语言】第3章 寄存器(内存访问)_出栈


【汇编语言】第3章 寄存器(内存访问)_数据_02

3.2 DS 和 [address]

DS 存放要访问数据的段地址。
mov指令也可以将一个内存单元中的内容传入到一个寄存器中。

mov 寄存器名 内存单元地址
mov al,[0]

[]表示一个内存单元,[0]中的0表示内存单元的偏移地址,8086CPU自动取DS中的数据为内存单元的段地址

但是8086CPU不支持将数据直接送入段寄存器
也就是说你可以

mov bx,1000H
mov ds,bx

但是不能

mov ds,1000H

问题3.2

【汇编语言】第3章 寄存器(内存访问)_数据_03

mov bx,1000H
mov ds,bx
mov [0],al

3.3 字的传送

8086CPU是16为架构可以一次性传一个字

问题3.3

【汇编语言】第3章 寄存器(内存访问)_寄存器_04


ax=1000 H

ds=1000 H

ax=1123 H (1000:0)

bx=6622 H (1000:2)

cx=2211 H (1000:1)

bx=8833 H (6622 H+2211 H)

cx=8833 H (2211 H+6622 H)

【汇编语言】第3章 寄存器(内存访问)_数据_05

问题3.4

【汇编语言】第3章 寄存器(内存访问)_数据_06


ax=1000 H

ds=1000 H

ax=2C34 H

1000:0=2C34 H

bx=2C34 H

bx=1B12 H

1000:2 1B12 H

【汇编语言】第3章 寄存器(内存访问)_数据_07

3.4 mov,add,sub 指令

MOV

指令

例子

mov 寄存器 数据

mov ax,8

mov 寄存器,寄存器

mov ax,bx

mov 寄存器,内存单元

mov ax,[0]

mov 内存单元,寄存器

mov [0],ax

mov 段寄存器,寄存器

mov ds,ax

mov 寄存器,段寄存器

mov ax,dx

mov 内存单元,寄存器

mov [0

mov 段寄存器,内存单元

mov ds,[0]

【汇编语言】第3章 寄存器(内存访问)_数据_08


但是不能对段寄存器操作

【汇编语言】第3章 寄存器(内存访问)_出栈_09

3.5 数据段

我们可以定义一组长度为N(N<=64KB),地址连续,起始地址为16倍数的内存单元当作专门存储数据的内存空间,从而定义了一个数据段

问题3.5

【汇编语言】第3章 寄存器(内存访问)_数据_10


A指令输入后U指令查看

【汇编语言】第3章 寄存器(内存访问)_寄存器_11


可以发现123B H被送入到DS中了

【汇编语言】第3章 寄存器(内存访问)_数据_12


但是我们使用D指令查看的话发现数据段里都是0

【汇编语言】第3章 寄存器(内存访问)_出栈_13


所以我们先用E指令修改相应内存单元的值

【汇编语言】第3章 寄存器(内存访问)_数据_14


【汇编语言】第3章 寄存器(内存访问)_数据_15


然后成功执行了

【汇编语言】第3章 寄存器(内存访问)_出栈_16

3.6 栈

后进先出原则(LIFO)

3.7 CPU提供的栈机制

任意时刻,SS:SP指向栈顶元素,段寄存器SS存放栈顶的段地址,寄存器SP存放偏移地址.

push和pop指令执行时,CPU通过SS和SP获得栈顶地址

入栈时,栈顶从高地址向低地址增长

push ax

(1) SP=SP-2

(2) 把ax内容送入SS:SP指向的内存单元

pop ax和push ax相反

(1)SS:SP 指向的内存单元出数据送入ax

(2)SP=SP+2

问题3.6

【汇编语言】第3章 寄存器(内存访问)_寄存器_17


栈空,SS:SP指向栈空间最高地址单元的下一个单元

【汇编语言】第3章 寄存器(内存访问)_出栈_18

3.8 栈顶超界的问题

push和pop可能造成超界问题,但是8086CPU不保证我们对栈的操作不会越界。
如果发送越界可能造成数据覆盖,所以要小心

3.9 push、pop指令

注意,栈操作都是以字为单位的。

指令

功能

push 寄存器

将一个寄存器中的数据入栈

push 段寄存器

将一个段寄存器中的数据入栈

push 内存单元

将一个内存单元中的字入栈

pop 寄存器

出栈,用一个寄存器接受出栈的数据

pop 段寄存器

出栈,用一个段寄存器接受出栈的数据

pop 内存单元

出栈,用一个内存单元接受出栈的数据

问题3.7

【汇编语言】第3章 寄存器(内存访问)_寄存器_19


A指令编写命令后U查看,T执行

【汇编语言】第3章 寄存器(内存访问)_寄存器_20

【汇编语言】第3章 寄存器(内存访问)_出栈_21


【汇编语言】第3章 寄存器(内存访问)_寄存器_22

问题3.8

【汇编语言】第3章 寄存器(内存访问)_数据_23

【汇编语言】第3章 寄存器(内存访问)_寄存器_24


A输入命令,U查看,T执行

【汇编语言】第3章 寄存器(内存访问)_寄存器_25


【汇编语言】第3章 寄存器(内存访问)_数据_26


【汇编语言】第3章 寄存器(内存访问)_数据_27


【汇编语言】第3章 寄存器(内存访问)_寄存器_28


问题3.9

和前面差不多懒得打了,这边主要利用LIOF的性质

【汇编语言】第3章 寄存器(内存访问)_寄存器_29

【汇编语言】第3章 寄存器(内存访问)_数据_30


问题3.10

就用栈传数据嘛,想办法指向10000H就行了

【汇编语言】第3章 寄存器(内存访问)_数据_31

mov ax,1000H
mov ss,ax
mov sp,0002H

3.10 栈段

把长度为N(N<=64 KB)的一组地址连续,起始为16倍数的内存单元当作栈空间来用,从而定义了一个栈段

问题3.11

【汇编语言】第3章 寄存器(内存访问)_寄存器_32


栈最底的字单元地址为1000:FFFE。SS=1000,SP=FFFE,所以栈为空的时候SP=0

这题主要两点
1根据栈段确定栈最底字单元地址
2计算栈为空时SP

问题3.12
一个栈段最大可以设为多少?为什么?
64 KB,push和pop使用的时候知识修改SP,所以栈顶变化范围0~FFFF H,所以64 KB

书本小结

【汇编语言】第3章 寄存器(内存访问)_寄存器_33


【汇编语言】第3章 寄存器(内存访问)_出栈_34


【汇编语言】第3章 寄存器(内存访问)_出栈_35

习题解析

【汇编语言】第3章 寄存器(内存访问)_数据_36

【汇编语言】第3章 寄存器(内存访问)_出栈_37

指令

AX

BX

CS

IP

DS

初始

0

0

2000 H

0

1000 H

MOV AX,6622 H

6622 H

0

2000 H

3

1000 H

JMP 0FF0:0100

6622 H

0

0FF0 H

0100 H

1000 H

MOV AX,2000 H

2000 H

0

0FF0 H

0103 H

1000 H

MOV DS,AX

2000 H

0

0FF0 H

0105 H

2000 H

MOV AX,[0008]

C389 H

0

0FF0 H

0108 H

2000 H

MOV AX,[0002]

EA66 H

0

0FF0 H

010B H

2000 H

【汇编语言】第3章 寄存器(内存访问)_出栈_38

MOV AX,2000H 
MOV SS,AX
MOV SP,0010H

【汇编语言】第3章 寄存器(内存访问)_出栈_39

MOV AX,1000H
MOV SS,AX
MOV SP,0

个人总结

这章主要两个,寄存器访问内存和栈段
寄存器访问内存要记住如何找到内存地址
栈段的话主要记住push操作和pop操作流程
新增的几个寄存器
段寄存器DS:存内存访问时段地址
段寄存器SS存放栈顶的段地址,寄存器SP存放偏移地址.
还有就是段的概念应用到变成中:数据段,代码段,栈段


标签:汇编语言,SP,mov,内存,寄存器,ax,单元
From: https://blog.51cto.com/u_15891800/5887555

相关文章

  • [ Linux ] 进程间通信之共享内存
    在上篇博文我们了解了通过管道完成进程间通信,我们了解匿名管道和命名管道,并且通过编码模拟实现使用了匿名管道和命名管道。我们知道要让进程间完成通信必须让这两个进程首先......
  • java ThreadLocal 内存泄露
    原文:https://zhuanlan.zhihu.com/p/56214714 前言ThreadLocal 的作用是提供线程内的局部变量,这种变量在线程的生命周期内起作用,减少同一个线程内多个函数或者组件之......
  • 后端踩坑笔记:记一次内存泄漏查障修复过程
    前言由于某开发项目的特殊性,在开发过程中需要将一些核心的代码加密。但是项目一开始就是由swoft框架(一个基于swoole的PHP框架)进行开发,未找到swoft代码加密工具。因此想到了......
  • PHP 数组占用内存分析
    下面的做法会占用多大的内存?list($appid,$openid)=["testcontent","test"];测试:$m0=memory_get_usage();$k=range(1,200000);$m1=memory_get_usage();echoround((......
  • Java的内存回收机制
    1.Java在内存中的状态首先我们先写一个代码为例子:Person.javapackagetest;importjava.io.Serializable;publicclassPersonimplementsSerializable{static......
  • 直接内存(操作系统内存)
    定义:  分配和回收原理  若设置  -XX:+DisableExplicitGC  (禁用显示的GC)即代码中的System.gc();   无效可能会导致直接内存无法释放;(解决办法:可使用un......
  • hadoop任务超出虚拟内存限制问题(beyond the 'VIRTUAL' memory limit)
    今天用hive跑任务,一个小问题困扰了许久,问题如下:Container[pid=5284,containerID=container_1669278775243_0001_01_000005]isrunning346733056Bbeyondthe'VIRTUAL'......
  • 一文详解GaussDB(DWS) 的并发管控和内存管控
    摘要:DWS的负载管理分为两层,第一层为cn的全局并发控制,第二层为资源池级别的并发控制。本文分享自华为云社区《GaussDB(DWS)并发管控&内存管控》,作者:fighttingman。1背景......
  • 一文详解GaussDB(DWS) 的并发管控和内存管控
    摘要:DWS的负载管理分为两层,第一层为cn的全局并发控制,第二层为资源池级别的并发控制。本文分享自华为云社区《​​GaussDB(DWS)并发管控&内存管控​​》,作者:fighttingman。......
  • Toad for Oracle 导入MIP.dmp文件时:报内存不足时的解决办法:
    摘要:最近在使用Oracle数据库开发项目,其中在用ToadforOracle连接操作Oracle11g的时候出现了问题,问题是这样的:在数据库管理员的连接下导入已经建立的用户的dmp文件,会报内存......