汇编的数据段和栈

1.DS和[address]

例如:我们要读取10000H单元的内容可以用如下程序进行

mov bx,1000H

mov ds,bx

mov al,[0]

上面的三条指令是将10000H(1000:0)中的数据读到al中。

[...]表示一个内存单元,[...]中的0表示内存单元的偏移地址。我们知道只有偏移地址是不能定位一个内存单元的,那么内存单元的段地址是多少呢?指令执行时,8086CPU自动获取ds中的数据位内存单元的段地址。

再来看一下,我们如何用mov指令从10000H中读取数据。10000H用段地址和偏移地址表示为1000:0,我们先将1000H放入ds,然后用mov al,[0]完成传送。mov指令中的[]说明操作对象是一个内存单元,[]中的0表示这个内存单元的偏移地址是0,它的段地址默认放在ds中,指令执行时,8086CPU会自动从ds中取出。

如何将一个数据放入ds寄存器呢,直接用mov ds 1000H?现在并非如此,8086CPU不支持将数据直接送入段寄存器的操作,ds是一个段寄存器,所以mov ds,1000H这条指令是非法的。那么如果将1000H送入到ds中?只要用一个寄存器来进行中转,即先将1000H送入一个一般的寄存器,如bx,再将bx的内容送入ds。

2.字的传送

前面我们用mov指令在寄存器和内存之间进行字节型数据的传送,因为8086CPU是16位结构,有16根数据线,所以,可以一次传送16位的数据,也就是说可以一次性传送一个字。我们只要在mov指令中给出16位寄存器就可以进行16位数据的传送了。比如:

mov bx,1000H;

mov ds,bx;

mov ax,[0];

mov [0],cx;cx中的16位数据送到1000:0处

3.栈

8086CPU的入栈和出栈操作是以字为单位进行的。注意:字型数据用俩个单元存放,搞地址单元存放高8位,低地址段元放低8位。有俩个问题如下:

1.CPU如何知道一段内存空间被当做栈?

2.执行push和pop时候,如果知道哪个单元是栈顶

答案:SS:SP,段寄存器SS存放栈顶段地址,SP存放栈顶偏移地址。入栈时,栈顶从高地址向低地址方向增长。

汇编的数据段和栈,码迷,mamicode.com

时间: 2024-10-24 11:30:21

汇编的数据段和栈的相关文章

AT&T x86_32 汇编_003_数据段

以上两节讲解了两个简单的示例程序, 从这一节开始, 就要接触到枯燥的细节了. 1. 在数据段中定义"全局变量" 在前面两讲中, 我们分别以.ascii和.asciz, 在数据段定义过字符串数据. 如下这样: .section .data output1: .ascii "The processor Vendor ID is 'xxxxxxxxxxxx'\n" output2: .asciz "The processor Vendor ID is '%s'\

韦东山yy公开课笔记(2)--汇编,段,栈,重定位/链接地址,位置无关吗

1. 要不要学习汇编 可以只懂一点,工作中基本不用,一旦用就是出了大问题 ldr : load 读内存 ldr r0, [r1]  : r1里存放的是地址值, 去这个地址读取4字节的内容,存入r0 str : stroe 写内存 str r0, [r1]  : r1里存放的是地址值, 把r0里的4字节数据存入这个地址 所有的汇编.C程序也好,终极目标就是:读写某个地址 2. 程序为何要分为代码段.数据段.BSS段 程序的指令等是只读的,可以把它们归为一类,以便运行时可以放在ROM等设备上, 当然

BSS段、数据段、代码段、堆与栈

BSS段:BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域. BSS是英文Block Started by Symbol的简称.BSS段属于静态内存分配. 数据段:数据段(data segment)通常是指用来存放程序中已初始化的全局变量的一块内存区域. 数据段属于静态内存分配. 代码段:代码段(code segment/text segment)通常是指用来存放程序执行代码的一块内存区 域.这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读

内存分配(堆、栈、BSS、代码段、数据段)

这两天看了马士兵老师的视频.视频中提到了一个万能钥匙.就是了解程序运行中对内存的操作.主要讲了堆.栈.Data.说真的有点晕.看了两遍.也就略懂一二.在这做个小小知道总结 简介 我们程序运行的时候都是放在内存里的.根据静态.成员函数.代码段.对象.等等.放在不同的内存分块里.大概分为5块 1  栈 2  堆 3 BSS段-全局区-(静态区) 4 代码段 5 数据段 栈 存放局部变量.临时变量.声明.返回值.指向堆对象的地址(指针).总之存放一些小的东西.当不需要时候.栈会自动清除.比如一个加法方

比较分别在数据段与附加段中的字符串以及汇编中常见的四种中断指令

1.从键盘输入两个相同长度的字符串,分别放到数据段和附加段,利用串比较指令比较数据段和附加段中两个字符串,如果两串一样,输出Y,否则输出N. 这个程序调试了好久,之间遇到两个问题,其一是附加段的使用,需要对DS压栈对ES调整处理,即 1 PUSH DS 2 MOV AX,ES 3 MOV DS,AX 4 ;...... 5 POP DS 其二是,串比较指令CMPSW进行字比较,而CMPSB进行字节比较,需要区分开.(其实我现在还不明白即便是字符组成的串,进行字比较为什么会出错,有高手知道吗?)

C语言之程序中内存的来源:栈 堆 数据段

程序在运行的时候,其内存的来源主要通过三种方法:  栈  堆  数据段,总体上来讲栈是一般用来存放小内存的局部变量,堆内存和数据段的属性很像,在使用的的时候,如果这个变量是伴随程序一直存在则使用全局变量,也就是放在数据段,如果一个变量使用完了就没用了,那么就适合用堆内存(先申请,然后释放即可), 一:栈(stack): 1:栈在使用的时候是编译器自动分配内存空间的,不需要程序员的干涉,其次栈的大小是有限的,所以当我们定义的变量需要大片的内存的时候就不适合使用栈, 2:栈存放的是普通变量,栈的在使

栈、堆、数据段、代码段的区别

1.栈(stack) 保存局部变量的,函数结束,其局部变量的生命就结束了(当然是不包括static变量).即释放了栈的空间(顺便提一下:栈特点为后进先出的!). 函数return后需要释放栈,函数被调用的时候需要分配栈. 2.堆(heap)是操作系统申请的内存空间,需要程序主动申请,主动释放,绝大多数用到的是动态变量的使用! 3.数据段是存取全局变量何静态变量的. 4.代码段是存取代码的. 在Linux中还存在这一个BBS段! 可参考http://blog.csdn.net/jxhui23/ar

汇编语言——寄存器(内存访问 ds数据段寄存器,ss栈段寄存器)

在内存中字的存储 这段话的主要意思是:一个字=2B=16bit,CPU中是用两个内存单元储存一个字(假如获取0地址存放的字型数据,就是获取它的高位字节0+1位和低位字节0位的数据,数据由高地址位向低地址位读) 问题: (1)0地址单元中存放的字节型数据是多少? #  20H(2)0地址字单元中存放的字型数据是多少? # 4e20H(3)2地址字单元中存放的字节型数据是多少? # 12H(4)2地址单元中存放的字型数据是多少?    #  0012H(5)1地址字单元中存放的字型数据是多少? #

内存布局:栈,堆,BSS段(静态区),代码段,数据段

摘自:https://www.cnblogs.com/Spider-spiders/p/8884729.html 简介 我们程序运行的时候都是放在内存里的.根据静态.成员函数.代码段.对象.等等.放在不同的内存分块里.大概分为5块 1  栈 2  堆 3 BSS段-全局区-(静态区) 4 代码段 5 数据段 栈 存放局部变量.临时变量.声明.返回值.指向堆对象的地址(指针).总之存放一些小的东西.当不需要时候.栈会自动清除.比如一个加法方法里面.声明了两个int并赋值.这两个就是放在栈里面.类里