汇编学习第三章

在第三章的学习中,我们开始更深入地学习寄存器。

(一)字在内存中的存储与内存单元地址

  在第二章中,我们了解到,在CPU中,用16位寄存器来存储一个字,但是由于内存单元是字节单元(即在一个单元内只能存放一个字节),所以一个字要用两个内存单元来存放。举个例子,我们用0、1两个单元来存放数据4E20H,0号单元为低地址单元,1号为高地址单元单元,分别存放它的低位、高位数据。由此,我们提出字单元的概念:由两个地址连续的内存单元组成,用来存放一个16位数据的内存单元。,一般我们将起始地址为N的字单元简称为N地址单元。

(二)字的传送

  CPU要读取一个内存单元需要给出这个单元的地址,它的段地址通常存放在DS寄存器中,举个例子,我们要读取地址为10000H单元的内容,可以用如下代码:

mov bx,1000H

mov ds,bx

mov ax,[0]

上面指令的作用是将内存10000H中的数据读到al中

  [...]代表一个内存单元,[]里面的为其偏移地址,例如[0]代表ds:0地址的内存单元

  从第二章我们知道,通过mov指令我们可以将数据在寄存器和内存中传输,执行指令时,CPU会自动从ds中取出段地址

  注意,8086CPU不支持直接将数据送入段寄存器

关于mov,sub,add命令我们已经在上一章介绍的很详细了,就不再多提了

在编程时,为了存放数据,我们可以将一组内存单元定义为一个段专门用于存放数据,这就是数据段。具体操作时,我们一般用DS存放数据段的段地址,再根据需要访问数据段中的具体单元。

(三)栈和栈段  

栈是一种具有特殊访问方式的储存空间,最后进入这个空间的数据,最先出去。

栈有两个基本的操作:入栈和出栈。入栈就是将一个新的元素放到栈顶,出栈就是从栈顶取出一个元素。栈顶的元素总是最后入栈,又在出栈时最先出栈(即LIFO规则)

CPU提供PUSH(入栈)和POP(出栈)的指令操作,我们在编程时,可以将一段内存当作栈来使用。push ax 代表将寄存器ax中的数据送入栈中,pop ax代表从栈顶取出数据送入ax。

8086中SS和SP寄存器分别用来存放栈顶段地址和偏移地址,通过SS和SP设定的栈空间称为栈段,最大为64KB。CPU提供的出栈、入栈操作都是以字为单位的。SS:SP永远指向栈顶单元。

push ax:将SP=SP-2,再将数据存放到SS:SP开始的两个内存单元中

pop ax;将SS:IP处存放的字放入到ax,再将SP=SP+2,更新栈顶。

(四)检测点

  检测点3.1:

(1)ax=2662H;bx=E626H;ax=E626H;ax=2662H;bx=D6E6H;ax=FD48H;ax=2C14H;ax=0;ax=00E6H;bx=0;bx=0026H;ax=000CH;

(2)

指令                  执行指令后:CS            IP            DS            AX           BX

mov ax,6622H                2000H         0003H      1000H       6622H         0

jmp 0ff0:0100                 0ff0H            0100H      1000H       6622H         0

mov ax,2000H     0ff0H       0103H      1000H       2000H      0

mov ds,ax       0ff0H       0105H  2000H   2000H    0

mov ax,[8]      0ff0H        0108H      2000H  C389H   0

mov ax,[2]                0ff0H        010BH      2000H  EA66H   0

  检测点3.2:

(1)mov ax,2000H; mov ss,ax;mov sp,10H

(2)  mov ax,1000H;mov ss,ax;mov sp,0H

原文地址:https://www.cnblogs.com/makise-kurisu/p/9912333.html

时间: 2024-09-30 00:53:24

汇编学习第三章的相关文章

oracle学习 第三章 常用的SQL*PLUS命令 ——02

今天接着昨天的RUN命令继续讲. 3.5 n(设置当前行)命令和A(PPEND)(附加)命令 设想,你输入了例3-10的查询语句 例 3-10 SQL> SELECT ename 2 FROM emp; 例 3-10 结果 看到以上输出时,您发现在SELECT子句中忘了job,sal.这时您又如何修改您的SELECT子句呢?首先您应该使用SQL*PLUS的L(LIST)命令来显示SQL缓冲中的内容. 例 3-11 SQL> L 例 3-11 结果 在例3-11显示的结果中,2后面的"

安卓学习——第三章

安卓学习——第三章 由于自身的实力不足,经过尝试后放弃了自己编写记账本app,而是打算找到合适的相关项目进行学习.我找到了几个AndroidStudio项目,我在AndroidStudio里面直接打开文件,发现无法运行.想到应该是import项目才行(我可真是菜的真实). 通过import这些项目之后,发现其中一个项目竟然是可以跑起来的.我便将项目通过手机进行测试,发现在手机上也是可以运行的.不过有一些在外观上的问题. 首先是在手机上的显示,会有一部分文字内容是乱码.我便去找编译器里面相关文件的

Struts2框架学习第三章——Struts2基础

本章要点 —  Struts 1框架的基本知识 — 使用Struts 1框架开发Web应用 —  WebWork框架的基本知识 — 使用WebWork框架开发Web应用 — 在Eclipse中整合Tomcat — 使用Eclipse开发Web应用 — 为Web应用增加Struts 2支持 —  Struts 2框架的MVC组件 —  Struts 2框架的流程 — 通过web.xml文件加载Struts 2框架 — 通过struts.properties文件配置Struts 2属性 —  str

汇编学习笔记-序章

最近突然对汇编语言开始感兴趣,于是说干就干了. 之前也自学过一点汇编,是跟着王爽老师的<汇编语言(第3版) >这本书学习的,已经是有5 6前年的样子了.当时觉得这本书写的非常通俗易懂是一本非常好的启蒙书籍,但是最近在翻阅的时候却觉得这本书知识点介绍的非常杂乱没有个章程,感觉像是没组织过一样想到哪里写到哪里.哈哈,个人愚见,王爽老师的粉丝不要喷我. 于是乎我去各种百度汇编学习的书籍推荐,在知乎.csdn找到了好几本推荐的书,然后就一股脑买了4本.所以我简单的根据书名排了个阅读顺序: 80x86汇

LinQ In Action 学习第三章

本章开始前先回顾一个小例子,复习一下第二章所讲内容 var pc = Process.GetProcesses()                .Where(p => p.WorkingSet64 >= 20 * 1024 * 1024) // lamador expression                .OrderByDescending(p => p.WorkingSet64)// extension method                .Select(p =>

汇编学习第四章

在第四章,通过前面的学习,我们已经了解了汇编语言的基本知识,现在我们开始学习编写汇编程序. (一)源程序   一个源程序从写出到执行需要三步: 编写:通过文本编辑器用汇编语言写出程序的文本文件 编译连接:通过汇编编译程序将文本文件编译成目标文件,再用连接程序连接,生成可执行文件 执行:即执行上一步生成的可执行文件 源程序中包含两种指令,一种是汇编指令,一种是伪指令.汇编指令是指可以被编译为机器指令的指令,由CPU执行,而伪指令没有对应机器码,由编译器执行. 源程序的基本格式: assume 段寄

网络学习第三章(网桥)

网桥的多个接口的集合就形成了交换机,网桥就是交换机, 在交换机中的消息同样是广播的方式传送, 交换机的工作方式下一章学习.

oracle学习 第三章 常用的SQL*PLUS命令 ——01

下面我们开始新的一章学习! 当输入SQL语句时,该语句被存在SQL缓冲区中(即一个内存区).这个SQL缓冲区很小,只能存一个SQL语句,当下一条SQL语句输入时,原来在缓冲区中的SQL语句被覆盖掉.SQL*PLUS是一个工具(环境).正像我们所看到的,我们可以用它来输入SQL语句.为了有效的输入和编辑SQL语句,SQL*PLUS还提供了一些常用的命令.与SQL语句不同的是SQL*PLUS的命令是可以缩写的.下面就简单的介绍一些常用的SQL*PLUS命令. 3.1 DESC[RIBE]命令 一般在

汇编学习--第三天

4.1 一个源程序从写出到执行的过程 汇编语言源程序包含两种指令: 1.汇编指令 2.伪指令 汇编指令会被编译为机器指令,被CPU执行 伪指令不会,会被编译器执行 assume cs:codesg codesg segment mov ax,0123h mov bx,0456h add ax,bx add ax,ax mov ax,4c00h int 21h codesg ends end segment和ends的作用是定义一个段 codesg segment ;定义一个名叫codesg段的开