汇编子程序堆栈求解

汇编子程序堆栈求解,第1张

主程序压入了3个word值(6个字节---后面的ret 6,是指在返回时sp=sp+6,效果相当于d出这6个字节),还压入了返回的段内偏移代码地址1个word值(2个字节,返回时会自动送入ip)。

子程序中在引用参数之前,又压入了1个word值(sp),所以:

LOW_BIT 对应 [bp+4] ;

HIGH_BIT 对应 [bp+6] ;

AVER_INT 对应 [bp+8]

汇编语言程序设计步骤:

1、分析问题,抽象出描述问题的数据模型

2、确定问题的算法思想

3、画出流程图或结构图

4、分配存储器和工作单元(寄存器

5、逐条编写程序

6、静态检查,上机调试例:编程查找考生的最高分,假设所有考生分数已存入计算机内存

1、分析问题根据条件、特点、规律→数学模型本例分数已给定为0~200之间的整数集合(考虑加试分),记为{S},找max{S}(注:简单问题不一定写数学模型)

2、确定算法思想最好利用现成算法和程序设计方法,若无,则需根据实践经验总结算法思想

如本例,从成绩单第一分数往下看,边看边比较,记住较高分,舍弃较低分,直至看完,最高分存于脑中

归纳算法思想:建立数据指针并指向数据区首地址

将第一数取入寄存器(如AL),与下一数比较,若下一数大则将其取入寄存器,否则调整指针,再与下一数比较,重复上述过程,直至比较完毕,寄存器中即最高分

读分数用MOV指令,比较用CMP指令,分析判断用条件转移指令

3、画流程图或结构图有逻辑流程、算法流程、程序流程等,复杂问题需画模块结构

本例简单,只画出程序流程图(用模块化结构的N-S流程图表示):本例的N-S流程图图中初始化包括:设一个计数器,将分数个数减一后送计数器,每比较一次减一,至零查找结束;建立一个指针指向数据区

开始初始化取第一数到寄存器与下一数比较下一数大?是否取大数到寄存器修改指针,计数次数减一返回到循环体开始,直到计数次数为0退出循环结束

4、分配存储器空间和工作单元(寄存器)定义数据段、堆栈段、代码段等

工作单元一般用寄存器

本例:分数放数据段,建100字节堆栈空间,BX作数据指针,CX作计数器,AL放最高分

5、逐条编写程序DATASEGMENTFENDB85,90,60,75,87,35,80,78,96,82;存分数MAXDB;存最高分DATAENDSSTACKSEGMENTPARASTACK‘STACK’DB100DUP();100字节堆栈STACKENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKSTARTPROCFARPUSHDSMOVAX,0PUSHAX;为了返回DOSMOVAX,DATAMOVDS,AX;置数据段寄存器MOVBX,OFFSETFEN;置数据指针MOVCX,MAX-FEN;置计数器初值DECCX;N个分数比较N-1次MOVAL,[BX];取第一个分数LOP:INCBX;调整指针CMPAL,[BX];与下一数比较JAENEXT;大于等于则转MOVAL,[BX];否则取下一数NEXT:LOOPLOP;计数器减一,;不为零转LOPMOVMAX,AL;存放最高分RET;返回DOSSTARTENDPCODEENDSENDSTART6、静态检查,上机调试选用指令尽量字节少,使其执行速度快

易错处应重点查,如比较次数、转移条件等

确信无错后方可上机调试

你的程序并没有定义栈段。

若定义了,则应:

mov ax,seg sdeg

mov ss,ax

mov sp,top ------因为栈结构是从高地址向低地址生长的,要把栈段的最高处的偏移赋给sp

直接写 MOV AX, [BX] 是可以的,因为通过寄存器ax可以确定是传送的“字”

堆栈段指针(寄存器SS)是用于确定堆栈在内存中的起始位置的寄存器;堆栈段寄存器的作用和其他段寄存器(CS,DS,ES)相同,都是为了在一整段的内存中划分区域:由于内存为一整段储存单元,CS(代码段寄存器)中存放代码段的起始位置,DS(数据段寄存器)中存放数据段的起始位置,SS(堆栈段寄存器)中存放堆栈段的起始位置,ES(附加段寄存器)中存放附加段的起始位置。

在 *** 作系统架构的内存中,堆栈位于程序所使用内存的顶端,向内存低地址处扩展,DS寄存器中存放的是堆栈最低的地址。堆栈本身为内存的一部分,但是相对普通内存段(DS)的区别在于:普通内存段(DS)一般用于存放长久数据,无特殊存储顺序;堆栈内存段(SS)一般用于存放暂时数据(例如调用函数是的参数),可以使用PUSH,POP指令向栈顶压入,d出数据。

另外,若SP(栈顶寄存器)中的值小于DS寄存器(PUSH指令执行过多次)将会引发错误:系统显示某某程序Stack Overflow(因为SS段往下的内存地址属于数据段的区域)。若SP中的值大于一定程度(由程序的堆栈段大小决定)(POP指令执行过多),也将会引发错误:系统显示某某程序Access Violation Reading Address(因为程序内存的顶端上有着其他数据)。

需要注意的是,在较新的 *** 作系统下汇编其平台下的程序时,程序员将无法修改段寄存器中的值(修改会报错),它们由 *** 作系统自身管理(可以理解为由 *** 作系统编写者的代码管理),其原因是出于安全起见。

以上就是关于汇编子程序堆栈求解全部的内容,包括:汇编子程序堆栈求解、汇编语言程序设计步骤有那几步_汇编语言编程步骤有哪些、汇编语言中堆栈段的问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10211360.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-06
下一篇 2023-05-06

发表评论

登录后才能评论

评论列表(0条)

保存