汇编语言程序设计第三章

第三章 寄存器(内存访问)

1 内存中字的存储

1个字=2个字节,如从0开始存放20000(4E20H),20、4E分别表示1个字节,内存中字的存储如下图所示:

任何两个地址连续的内存单元(0、1、2......),N号单元和N+1号单元,可以看成两个内存单元。比如说上图中的0内存单元(字节单元,存放的是字节型数据,就是20H(十进制的32);0地址字单元,存放字型数据,就是4E20H。

任何两个地址连续的内存单元,N号单元和N+1号单元,也可以看成一个地址为N的字单元中的高位字节单元和低位字节单元。比如上图中1字单元中,所代表的字是124EH,高位字节单元是2内存单元——12H低位字节单元是1内存单元——4EH

2 DS和[address]

CPU读取内存单元时,必须先读取到这个内存单元的地址。8086CPU中,内存地址是由段地址和偏移地址组成,8086CPU中有一个DS寄存器,用来存放要访问的数据的段地址。

例子:读取10000H单元的内容,可以用这样的一段代码来实现:

mov bx,1000H

mov ds,bx

mov al,[0]

使用mov指令,可以完成两种传送:将数据直接送入寄存器;将一个寄存器中的内容送入另一个寄存器。mov指令还能够将一个内存单元中的内容送入一个寄存器。那么mov al,[0] ,就是将内存单元中,偏移地址为0的内存单元中的内容放入到ax通用寄存器中的低八位al(8位)中。一个段地址对应一个偏移地址,上面的代码中,段地址为1000,对应的偏移地址为0。

3 字的传送

8086CPU是16位结构,有16根数据线,所以一次性可以传送16位的数据,也就是一次性传送1个字(1个字=2个字节=16位)。

如下代码:

mov bx,1000H

mov ds,bx

mov ax,[0] ---->这里是将1000:0处的字型数据(1个字,16位)送入到ax(16位)当中

mov [0],cx ---->这里是将cx(16位)中的数据放入到1000:0(16位)内存单元中。

4 mov,add,sub指令

mov指令的几种形式

mov 寄存器,数据       如mov ax,2C3B

mov 寄存器,寄存器      如mov bx,ax

mov 寄存器,内存单元      如mov ax,[0]

mov 内存单元,寄存器       如mov [0],bx

mov 段寄存器,寄存器       如mov ds,ax

add 和 sub 指令同 mov 一样,都有两个操作对象。

add 寄存器, 数据        如:add ax, 8

add 寄存器, 寄存器       如:add bx, ax

add 寄存器, 内存单元       如:add ax, [0]

add 内存单元, 寄存器       如:add [0], ax

sub 寄存器, 数据      如:sub ax, 8

sub 寄存器, 寄存器     如:sub bx, ax

sub 寄存器, 内存单元       如:sub ax, [0]

sub 内存单元, 寄存器        如:sub [0], ax

5 数据

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

如何访问数据段中的数据呢?将一段内存当作数据段,是我们在编程时的一种安排,我们可以在具体操作的时候,用 ds 存放数据段的段地址,再根据需要,用相关指令访问数据段中的具体单元。

6 栈

栈顶的元素总是最后入栈,需要出栈时,又最先从栈中取出。

7 CPU提供的栈机制

现今的CPU中都有栈的设计。8086CPU提供相关的指令来以栈的方式访问内存空间。这意味着,我们在基于8086CPU编程的时候,可以将一段内存当作栈来使用。

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

8 栈顶超界的问题

栈顶越界是危险的:因为我们既然将一段空间安排为栈,那么在栈空间之外的空间里很可能存放了具有其它用途的数据、代码等,这些数据、代码可能是我们自己的程序中的,也可能是别的程序中的。但是由于我们在入栈出栈时的不小心,而将这些数据、代码意外地改写,将会引发一连串的错误。

我们在编程的时候要自己操心栈顶越界问题,要根据可能用到的最大栈空间来安排栈的大小,防止入栈的数据太多而导致的越界。执行出栈操作的时候也要注意,以防止栈空的时候继续出栈而导致的越界。

9 push,pop指令

push和pop指令是可以在寄存器和内存之间传送数据的。

push和pop指令的格式(1)

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

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

push和pop指令的格式(2)

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

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

原文地址:https://www.cnblogs.com/sqy1999/p/9813631.html

时间: 2024-11-06 03:37:51

汇编语言程序设计第三章的相关文章

汇编语言程序设计 第2章概念梳理

汇编语言程序设计 第2章概念梳理 8086 14个寄存器: AX,BX,CX,DX (通用寄存器) SI,DI,BP,SP (基址和变址寄存器) CS,SS,DS,ES (段寄存器) IP,FLAGS (指令指针和标志寄存器) 通用寄存器: AX,BX,CX,DX通常用于存放一般性数据 称为通用寄存器 一般存储的数据范围为0 ~ 2^16-1 且为了与早期CPU操作兼容,这4个寄存器均可拆分成2个8位寄存器单独使用 {             AX分为AH和AL            BX分为B

Javascript高级程序设计——第三章:基本概念

javascript高级程序设计——第三章:基本概念 一.语法 EMCA-262通过叫做ECMAScript的“伪语言”为我们描述了javascript实现的基本概念 javascript借鉴了C的语法,区分大小写,标示符以字母.下划线.或美元符号($)开头,注释可以用 // 或者/* */ 严格模式: ECMAScript 5引入了严格模式,在严格模式下不确定的行为将得到处理,通过在顶部添加 “use strict”来启用严格模式: function fuc(){ "use strict&qu

汇编语言程序设计 第3章概念梳理

汇编语言程序设计 第3章概念梳理 基础概念部分:{ 字数据在内存当中的存储:高-高 低-低     字数据的低位字节存放在低地址内存单元     字数据的高位字节存放在高地址内存单元 取低地址内存单元地址作为字数据地址,例如数据124EH:    12H存储在偏移量为"2"的字节单元,4EH存储在偏移量为"1"的字节单元    则从地址为"1"的地址单元取出的一个字数据为124EH   12为高位,故存储在高位"2"单元,4E

汇编语言程序设计第五章

5.1 [BX] mov ax,[bx]  功能:bx中存放的数据作为一个偏移地址EA,段地址SA默认在ds中,将SA:EA处的数据送入ax中.即:(ax)=((ds)*16+(bx)). mov [bx],ax 功能:bx中存放的数据作为一个偏移地址EA,段地址SA默认在ds中,将ax中的数据送入内存SA:EA中.即:((ds)*16+(bx))=(ax). 5.2 Loop指令 loop指令的格式:loop 标号.CPU执行loop指令有两个步骤:①(cx)=(cx)-1②判断cx中的值,不

JS 高级程序设计 第三章

1.标识符: 标识符,是指变量.函数.属性的名字,或者函数的参数. 标识符的命名规则: (1)第一个字符必须是字母.下划线或者美元符号 (2)其他字符可以是字母.下划线.美元符号和数字. 修改变量值的同时可以修改值的类型 2.用var操作符定义的变量将成为定义该变量的作用域中的局部变量,省略var将建立一个全局变量. 3.ECMAScript中有五种简单的数据类型:Undefined.Null.Boolean.Number.String,还有一种复杂的数据结构-Object,它的本质是一组由无序

高级程序设计第三章

有五种简单数据类型:Underfined Null Boolean Number String ,和一种复杂数据类型Object typeof null 返回的是object, 0.1+0.2的结果不是0.3,而是0.30000000000000004. NaN与任何值都不相等,包括NaN本身, isNaN()在接收到一个值之后会尝试把这个值转换为数值. isNaN(NaN) //true isNaN(10)//false isNaN("10")//false isNaN("

Javascript高级程序设计——第三章:基本概念(二)

相等操作符: 相等==:这个操作符会先转换操作数,强制类型转换,然后再比较他们的相等性. null == undefined //true NaN == NaN //false"5" == 5 //true 全等===: 全等不会发生强制类型转变,同时会比较类型. "5" === 5 //falsenull === undefined //false 条件操作符varible = boolean_expression ? true_value : false_val

javascript高级程序设计第三章

看后总结: 1.区分大小写 2.标识符是有字母下划线$开头,并有字母.下划线.数字.美元符号组成. 3.建议用驼峰法命名标识符. 4.注释: 单行:// 多行: /*   */ 5.严格模式: 在js文件顶部或者函数的顶部使用"use strict":,将开启严格模式(ECMA 5.0引入) 6.每条语句结尾加分号 7.ECMA的变量是松散类型,就是可以保持任何类型的数据.

读书笔记 - js高级程序设计 - 第三章 基本概念 -

启用严格模式 "use strict" 这是一个 pragma 编译指示 让编码意图更清晰  是一个重要原则 5种简单数据类型 Undefined Null Boolean Number String 1种复杂数据类型 Object 检测数据类型的方法 typeof 有如下值: undefined boolean object string number function typeof Null object 意在保存对象还没有保存对象的变量的初始值最好是什么 null 八进制的第一位