⑴ 汇编中把数据段和代码段定义在同一段内有好处么
好处是能让编译出来的程序节省几个字节的大小,另外能让你在写源码的时候少打几个字,因为不用弄数据段了嘛,不过在写大程序的时候最好是把数据段和代码段分开,因为那样更清晰.当然如果你认为把数据和代码放在一起更清晰的话,你可以坚持自己的性格
恩,这个位置是非常讲究的
第一:在代码段中定义的数据不能定义到CS:IP可能碰到的地方,因为变量一旦被CS:IP碰到的话,就会把数据当成指令执行了.CPU很生气,后果很严重.例子:
正确的定义:
code segment
var01 db 64
start:
mov ax,cx
mov ds,ax
mov al,var01
mov ax,4C00H
int 21H
;也可以把"var01 db 64"放在这行里,放在这里的话上面定义的数据就不能要了
;CPU在执行完int 21H之后CS:IP就飘到别的地方去了,所以不会执行到这里
code ends
错误的定义:
code segment
start:
mov ax,cx
mov ds,ax
var01 db 64 ;CPU在执行的时候会光顾这里,所以不能定义在这里
mov al,var01
mov ax,4C00H
int 21H
code ends
第二:数据最好是定义在代码段的最前面或者最后面,让代码段的一部分是数据,一部分是代码,不然你如果一会是数据,一会是代码的话,看源码的人会很生气的.但这条可能有例外的情况,例子:
code segment
start:
mov ax,cx
mov ds,ax
jmp OMG
var01 db 64 ;前一条指令会让CS:IP指向下面的那条指令
;如果你认为这样很美的话可以这么干
OMG:
mov al,var01
mov ax,4C00H
int 21H
code ends
宏定义定义在哪我不知道有什么影响,不过一般好像都是定义在程序开头的
子程序定义在start前面或者
mov ax,4C00H
int 21H ;(也就是程序返回代码)
后面都一样
也可以通过前面那个例子里,用jmp弄出一段不会直接执行的空间,这样:
code segment
var01 db 64
start:
mov ax,cx
mov ds,ax
jmp OMG1
OMG2:
mov al,var01
ret
OMG1:
call OMG2
mov ax,4C00H
int 21H
code ends
我感觉这种方法非常2,其实子程序应该放在一起,像这样:
code segment
var01 db 64
start:
mov ax,cx
mov ds,ax
call OMG1
call OMG2
mov ax,4C00H
int 21H
OMG1:
mov al,var01
ret
OMG2:
xor al,al
ret
code ends
⑵ 汇编语言dw后面的数据放哪里ds还是cs
这部分一般在数据段定义 ds存放数据段段地址 cs存放代码段段地址 一般会在代码段中有这两句 mov ax,data mov ds,ax 作用是把data数据段的段地址送给ds 这样就实现了ds中地址是你定义的数据的段地址 cs中存放的代码段的段地址 它和IP组合CS:IP 可以指向代码段的某一条指令 这样机器就知道从什么地方开始执行指令了 执行一条后 IP自动加上刚刚执行的指令的长度 这样CS:IP就指向了下一句 这样就实现了一条接一条的来执行指令
但愿对你有帮助
⑶ 程序的指令存放在哪个逻辑段
存储器。
逻辑段就是程序设计中的数据分段不同的程序有不同的几个分段。在8086的程序设计中,一个程序可以有代码段CS、数据段SS、堆栈段SS和附加段ES。代码段CS用于存放程序;数据段SS和附加段ES用于存放数据;堆栈段SS用于存放数据(包括暂存数据和保护现场的数据)。在形成物理地址时,CS、DS、ES和SS四个段寄存器的作用如下:当取指令时,CPU以CS寄存器的值作段基址,再加上IP中的16位偏移地址,得到指令的物理地址。
⑷ 汇编语言 数据段 代码段 堆栈段 数据怎么看
较好的编程习惯是代码段放代码、数据段放数据、栈段用来保存环境恢复环境以及存放少量的局部变量。
但这些分段并不是绝对的,早期的程序并没有这些规矩,代码、数据是容许混放的,16位的com格式的程序代码、数据段、附加数据段、栈段是容许同段的。
单独拿数据来说,数据是可以放在内存中的任何地方,只要容许你访问。数据可以放在代码段中,可以放在栈中,也可以放在系统的堆内存中。
⑸ 进程控制块,数据段,程序段各自在内存的什么地方
进程控制块(PCB)在系统内存中,可以和其他进程同步执行
数据段存在静态内存,用于保存程序已经初始化的变量
代码段紧接着数据段,也在静态内存中
另外还有保存局部变量的栈和保存动态分配空间的堆
在内存中它们如下关系:
========高地址 =======
程序栈 堆栈段
向下增长
空内存
向上增长
堆
------ 数据段
BSS
------
非零数据
========= =======
代码 代码段
========= =======
=========低地址 =======
栈(存放着局部变量和函数参数等数据),向下生长 (可读可写可执行)
堆(给动态分配内存是使用),向上生长 (可读可写可执行)
数据段(保存全局数据和静态数据) (可读可写不可执行)
代码段(保存代码) (可读可执行不可写)
⑹ 程序代码在内存中是怎样放置的
一个程序至少有两个段:数据段和代码段。顾名思义数据段用来存放数据,也就是变量和数组之类,而代码段则用来存放一个指令序列。这个指令序列就是编程语言汇编出来的最后结果,是一系列机器码所表示的处理数据的步骤。CPU依次按照这个序列来处理数据,这就是程序的执行
⑺ 单片机数据段属于ram的一部分,代码段属于rom的一部分,这样理解对吗
可以这样理解,单片机的数据存储器和程序存储器是分开的,计算产生的数据存放于RAM,而程序只能存放于ROM
⑻ 8086/8088系统中,存储器为什么要分段,一个段的最大和最小各为多少字节
8086/8088系统中,存储器分段的主要目的是便于存储器的管理,使得可以用16位寄存器来寻址20位的内存空间。一个段最大为64KB,最小为16B。
存储器一般用来保存程序的中间结果,为随后的指令快速提供操作数,从而避免把中间结果存入内存,再读取内存的操作。
由于存储器的个数和容量都有限,不可能把所有中间结果都存储在存储器中,所以,要对存储器进行适当的调度。根据指令的要求,管理安排适当的寄存器,避免操作数过多的传送操作。
8086/8088CPU可直接寻址1MB的存储器空间,直接寻址需要20位地址码,而所有内部寄存器都是16位的,只能直接寻址6KB,因此采用分段技术来解决。将1MB的存储空间分成若干逻辑段,每段最长64KB,最短16B。这些逻辑段在整个存储空间中可浮动。
(8)代码段数据段放在哪里扩展阅读:
8086/8088CPU内部设置了4个16位段寄存器,它们分别是代码段寄存器CS、数据段寄存器DS、堆栈段寄存器SS、附加段寄存器ES、由它们给出相应逻辑段的首地址,称为“段基址”。段基址与段内偏移地址组合形成20位物理地址,段内偏移地址可以存放在寄存器中,也可以存放在存储器中。
程序较小时,代码段、数据段、堆栈段可放在一个段内,即包含在64KB之内,而当程序或数据量较大时,超过了64KB,那么可以定义多个代码段或数据段、堆栈段、附加段。
⑼ 程序运行时,程序代码是在堆中还是在栈中还是在内存中
在内存中。
楼上说的没错,一般计算机的内存分为好几个区域,每个区域都有自己的特回殊的作用。堆栈是答用来暂时存放数据和地址的。通常用来保护断点和现场。在单片机中,发生中断的时候cpu会执行中断服务程序。然而在cpu执行中断服务程序之前会先把断点地址推入堆栈,把现场的数据也推入堆栈。当执行完中断服务程序的时候,可以找到断点的地址,然后继续执行主程序。比如说我们使用计算机的时候,让计算机睡眠的时候也是先把cpu正在执行的程序压入堆栈保存起来。唤醒的时候可以很快的启动并继续执行睡眠前的服务。防止丢失数据。