汇编语言中怎么样定义堆栈段和数据段
如果是系统默认,那你这程序有何意义?所以程序应使用你自己定义的堆栈,这也是你的目的。
回到你问题,你之前有 assume ss:XX ,但编译器并不会就此认为 XX 就是你定义的堆栈,你得有所表示,所以你在源程序中一定要有语句表明你的意图,例如:MOV AX,XX MOV SS,AX
这样,XX 就跟堆栈段 SS 联系起来了,程序也就知道你定义的堆栈在哪了。
下面给一个简单例子,将数据段data的内容逆序存放到堆栈段stack中
ASSUME CS:CODE, DS:DATA, SS:STACK
DATA SEGMENT
DW 1,2,3,4,5,6,7,8
DATA ENDS
STACK SEGMENT
DW 0,0,0,0,0,0,0,0
STACK ENDS
CODE SEGMENT
START: MOV AX,DATA ;这里将自定义的数据段 DATA 与 DS 联系起来
MOV DS,AX
MOV AX,STACK ;这里将自定义的堆栈段 STACK 与 SS 联系起来
MOV SS,AX
MOV SP,10H
MOV BX,0
MOV CX,8
S: PUSH [BX]
ADD BX,2
LOOP S
MOV AX,4C00H
INT 21H
CODE ENDS
END START
定义堆栈段的时候,比较特殊,如果在后面加上 stack 指明定义堆栈段,就自动对ss,sp进行了赋值------否则只是一个普通的段,如果要使用它,就需要在代码中对ss,sp赋值。
这个需要看编译环境,用masm for windows这个软件时,可以不加。但是如果用debug运行时,可能会出错,提示没有定义堆栈段。
stack segment stack ; 堆栈段的定义
byte 64 dup(0)
stack ends
data segment ; 数据段的定义
msg byte 'hello world!$'
data ends
code segment ; 代码段的定义
start:
mov ax,data
mov ds,ax
mov dx,offset msg
mov ah,9
int 21h
mov ax,4c00h
int 21h
code ends
end start
;=============以上是一个常见的定义=============
masm 5.0 以后也支持简化定义如 .data 为数据段 .code表示代码段, 形式如下:
.model small
.stack 200h ; 定义堆栈段大小
.data ; 定义数据段
szMsg db 'Hello World!',13,10,'$'
.CODE ; 代码段的定义
START:
mov ax,@data
mov ds,ax
mov es,ax
mov si,0
mov es:[bx+1+si],ah
lea dx,szMsg
mov ah,9
int 21h
;暂停,任意键关闭
mov ah,1
int 21h
mov ah,4ch ;结束,可以修改al设置返回码
int 21h
END START
栈直接在push pop中就可以使用。
数据段在.data里面,可以初始化。
STACKS SEGMENT STACK ;堆栈段
DW 128 DUP(?) ;注意这里只有128个字节
STACKS ENDS
DATAS SEGMENT ;数据段
;请在这里定义您的数据
DATAS ENDS
CODES SEGMENT ;代码段
ASSUME CS:CODES,DS:DATAS
START: MOV AX,DATAS ;初始化
MOV DS,AX
;请在这里添加您的代码
MOV AX,4C00H ;退出程序
INT 21H
CODES ENDS
END START
C语言中typedef struct什么意思
类型定义。它就和define相对应,define是把一个自己起的名字的常量定义为代替它的另一个常量来同。typedef是把一个自己起的名字的类型用已经有的类型代替使用,如:typedef int Type1;之后如果有Type1 i ;系统则理解为int i;。在编程中使用typedef目的一般有两个,一个是给变量一个易记且意义明确...
.C#编程语言中,引入命名空间和定义命名空间的关键字是什么?精简回答谢 ...
,使用起来就有问题了道。为了解决这个问题,使用namespacexxx引入了名称空间的概念;使用的库函数或变量定义在这个名称空间中,这样就不会造成不必要的版本冲突。名称空间是一组可识别的名称,在使用可扩展标记语言时,XML名称空间是所有元素类别和属性的集合。元素类别和属性的名称通过的XML名称空间是的。
编程的定义
编程语言:用来定义计算机程序的形式语言,用来向计算机发出指令。简单来说,就是人类和计算机进行交流的语言。二、计算机如何处理程序?按照冯·诺依曼存储程序的原理,计算机的工作流程大致如下:用户打开程序,程序开始执行;操作系统将程序内容和相关数据送入计算机的内存;CPU根据程序内容从内存中读取指令;CPU...
c语言中π这个数字要怎么定义出来?
define PI 3.1415926 宏替换 ,用于说明某一特定输入(通常是字符串)如何根据预定义的规则转换成对应的输出(通常也是字符串)。这种替换在预编译时进行,称作宏展开。解释器或编译器在遇到宏时会自动进行这一模式替换。对于编译语言,宏展开在编译时发生,编译顺会自动将源程序中的PI替换为3.1415926。还...
编程语言中的AC代码,“AC”是什么意思?
很多编程语言需要用指令方式说明计算的程序,而有些编程语言则属于声明式编程,说明需要的结果,而不说明如何计算。编程语言的描述一般可以分为语法及语义。语法是说明编程语言中,哪些符号或文字的组合方式是正确的,语义则是对于编程的解释。有些语言是用规格文件定义,例如C语言的规格文件也是ISO标准中一...
c语言中定义与声明有什么区别??请说明的具体一些
如果是指变量的声明和定义:从编译原理上来说,声明是仅仅告诉编译器,有个某类型的变量会被使用,但是编译器并不会为它分配任何内存。而定义就是分配了内存。对于下面的两句代码:void Func(){ int a;int b=1;a=0;} 对于第一行代码,编译器不会做任何事,它不会为它在栈中分配一点东西,直到...
编程语言是什么意思?
计算机专业语言。简单来说,就是编写编定程序,让计算机代码解决某个问题,对某个计算体系规定一定的运算方式,使计算体系按照该计算方式运行,并最终得到相应结果的过程。为了使计算机能够理解人的想法,人类通过某种方式,将需解决的问题的思路、方法和手段通过计算机能够理解的形式告诉它,让计算机完成人的...
c语言中的定义代码怎么写?
我们可以根据程序的逻辑和任务的分工把代码划分到不同的自定义函数中,main()更关心业务逻辑和处理流程,需要执行具体任务的时候,调用这些自定义的函数就可以了。为了方使理解,我们把函数分为两种:一种是库函数,一种是自定义函数。库函数是C语言提供的,或系统提供的,实现了某些基本的功能,例如scanf...
函数定义与调用的编写顺序不分前后。
对于一些编程语言,如C语言,函数必须在调用之前定义。这是因为编译器需要知道函数的参数和返回类型,以便在编译时生成正确的代码。如果函数调用出现在函数定义之前,编译器将无法识别函数的参数和返回类型,从而导致编译错误。然而,在其他编程语言中,如Python和JavaScript,函数的定义和调用顺序可以任意。这是...
C语言中是如何定义常量的啊
此外,对于静态常量的访问在编译的时候,是用常量的值去替换常量,例如:int nValue = MAX_VALUE;这句在编译之后,和如下这句所产生的中间语言代码是一样的。int nValue = 10;不过,在用const来定义常量的时候,在类型上有很多限制。首先,此类型必须属于值类型或者String类型,同时此类型的初始化不...
尉婷复方: 百度_汇编吧_x86汇编教程3 http://tieba.baidu.com/f?kz=40974059 程序拥有了完整的堆栈段、数据段、代码段,其中堆栈段足足占掉 了512字节,其余的基本上没什么变化.分成多个段有什么好处呢?首先,它让程序显得更加清晰——你肯 定...
尖扎县13790255366: 汇编语言程序框架的基本原理是什么 - ?
尉婷复方: 书写顺序 数据段定义DSEG 堆栈段定义SSEG 代码段定义CSEG 附加段定义 其中 代码段是程序主体 有很强的逻辑结构 SSEG DSEG是物理存储 就是数据在内存中的位置 汇编语言是直接对CPU说话的 也就是直接对CPU进行操作 一般的汇编语言都是基于某种CPU的 多数为80X86的 因为规范利于教学
尖扎县13790255366: 试说明在8088汇编语言中,段是如何定义的??
尉婷复方: 在汇编语言中,段是一段连续的内存,由于受寄存器寻址位数的限制,每段的大小不超过64KB 在程序中,段按用途可分为代码段、数据段、附加段及堆栈段等.格式为 段名 segment [定位] [组合] [段字] ['类别'] ... ;语句序列 段名 ends (1) 段定位(align)属性——指定逻辑段在主存储器中的边界: (2) 段组合(Combine)属性——指定多个逻辑段之间的关系: (3) 段字(Use)属性——这是为支持32位段而设置的属性. (4) 段类别(Class)属性——当连接程序组织段时,将所有的同类别段相邻分配.
尖扎县13790255366: 汇编语言自己定义的堆栈 - ?
尉婷复方: 如果是系统默认,那你这程序有何意义?所以程序应使用你自己定义的堆栈,这也是你的目的. 回到你问题,你之前有 assume ss:XX ,但编译器并不会就此认为 XX 就是你定义的堆栈,你得有所表示,所以你在源程序中一定要有语句表明你的...
尖扎县13790255366: 汇编中的堆栈段、代码段 是什么? 是干吗的? - ?
尉婷复方: lz知不知道什么叫段?段就是由寄存器指示的一段内存空间.堆栈段:这段空间负责函数调用,比如所有局部变量都是存在于这里.代码段:这段空间存储你的指令(指令不用解释了吧).图书:王爽的《汇编语言程序设计》或者 杨季文 《80x86汇编语言程序设计教程》(名字不一定对,lz到google搜搜看)
尖扎县13790255366: 汇编语言程序设计步骤 有那几步 - ?
尉婷复方:[答案] 汇编语言程序设计步骤:1、 分析问题,抽象出描述问题的数据模型 2、 确定问题的算法思想 3、 画出流程图或结构图 4、 分配存储器和工作单元(寄存器) 5、 逐条编写程序 6、 静态检查,上机调试 例:编程查找考生的最高分,假设所有考生分...
尖扎县13790255366: 汇编程序中,数据段怎么定义,block db256 dup(55h),是什么意思 - ?
尉婷复方: 数据段的定义要看你用的汇编器的版本,如masm5和高版本的MASM就不同 MASM5: data segment MASM6: .data...block db 256 dup (55h) 是定义了一个具有256个元素的字节数组,而且这个数组的元素都是55H
尖扎县13790255366: 汇编语言段内,段间是什么意思 - ?
尉婷复方: 汇编语言的程序设计是分4个段来设计的,即用来放数据的数据段DS,临时存放数据的堆栈段SS、存放程序代码的代码段、存放附加数据的附加段,每一段的最大存储空间为64KB,跳转指令、程序调用指令在转移到地址没有超过64KB地址空间范围的叫段内转移,超出64KB地址空间范围的叫段间转移.这就是段内和段间的含义.
尖扎县13790255366: 汇编中的堆栈如何使用 - ?
尉婷复方: 堆栈的定义是这样的: dssg segment stackaa dw 512dup(?) dssg ends 一般的说,当PUSH/POP指令不频繁时用系统堆栈就可以了,但是当需要堆栈存储大量数据,如作为子程序传替参数时就要定义一个堆栈,而且一般来说一个段的内容不能超过64K,因为偏移地址最大只能表示64K,所以定义的堆栈也不能是无限大,如果超过了64K,就定义两个吧!堆栈在汇编中对于初学者用的很少,一般小程序都不需要用的!用起来也不是很难,就是注意下,在子程序调用时,什么时候是返回地址,什么时候是寄存器值!总之,记住先进后出,再做题时画个堆栈图,应该不会很难的!