上一题下一题
跳转到
 
 
  世界如此多姿,发展如此迅速,窥一斑未必还能知全豹。但正如万花筒一样,每一个管窥都色彩斑斓。  
 
 
  知识通道 | 学习首页 | 教师首页 | PK首页 | 知识创造首页 | 企业首页 | 登录
 
本文对应知识领域
寄存器的保护和恢复
作者:未知 申领版权
2010年12月12日 共有 1939 次访问 【添加到收藏夹】 【我要附加题目
受欢迎度:

    寄存器的保护和恢复
    保护寄存器说明子句的说明格式:
    USES  寄存器列表
    该说明子句要求汇编程序为其生成保护和恢复寄存器的指令序列,即:在进入子程序执行指令之前,把寄存器列表中的寄存器压进堆栈,在结束子程序执行时,把先前压进堆栈的寄存器弹出,以达到保护寄存器的目的。
    寄存器列表:列举出在子程序中需要保护的寄存器名,即:在子程序开始时需要把内容进栈的寄存器名。若有多个寄存器名,则在寄存器名之间要用“空格”来分开。
    例如:
    
    

 
    
Dsip
    
PROC USES AX DX, FUNC:WORD, MSG:PTR BYTE
    
 
    
 
    
MOV
    
DX, MSG
    
 
    
 
    
MOV
    
AX, FUNC
    
 
    
 
    
INT
    
 21H
    
 
    
 
    
RET
    
 
    
Disp
    
ENDP
    

汇编程序在处理该子程序时,会根据子句USES的作用,在第一条指令“MOV DX, MSG”之前,插入把寄存器AX和DX进栈的指令序列,即:
    PUSH  AX
    PUSH  DX
    而在返回指令RET之前插入把寄存器DX和AX的值弹出的指令序列,即:
    POP  DX
    POP  AX
    注意:若子程序含有多个RET或IRET指令,那么,汇编程序在每个RET或IRET指令前都将增加相应的弹出堆栈指令序列。
    从子句USES的功能来看,它与前面7.4节“寄存器的包含与恢复”中所用的方法完全一致,所不同的是:用USE子句进行寄存器保护和恢复的代码是由汇编程序自动产生的,程序员不用关心如何去做,有点象高级语言的编程风格,而7.4节中的代码则是由程序员自己来安排的。
    7.5.7 子程序的参数传递
    子程序参数是用来向子程序传递信息的数据。若有多个参数,则参数之间要用逗号分割。为了能说明子程序的参数,程序员必须事先指定参数所遵循的语言类型或使用“语言类型”参数。
    参数的数据类型可以是任何一个有效的数据类型说明符或VARARG。VARARG数据类型允许向子程序传递“个数”不定的参数,其参数之间要用逗号“,”来分开。
    若参数表中含有VARARG说明的参数,那么,该参数一定是该子程序的最后一个参数。其规定隐含地说明了在参数表中只能有一个用VARARG说明的参数。
    当子程序的语言类型是C、SYSCALL和STDCALL时,在其参数表中才能使用VARARG数据类型的参数。见前面的表7.1中所列。
    如果没有显式地指定某个参数的数据类型,那么,在16位段规模的情况下,其缺省的数据类型是WORD;在32位段规模的情况下,其缺省的数据类型是DWORD。
    7.5.8 子程序的原型说明
    子程序原型的说明格式如下:
    子程序名 PROTO  [distance] [langtype] [,[parameter]:tag]...
    该说明语句告诉汇编程序该子程序的若干属性,如:位距、语语言类型、参数个数及其类型等。这样,汇编程序就可以对其定义进行适当的检查。
    如果对所有基于堆栈的过程都定义一个原型,那么,就可把这些原型存放在一个独立的包含文件(用伪指令INCLDUE来装入)中。使用这种方法对将来把所有子程序放入自定义的库文件中是非常方便的。
    该原型说明语句中参数distance、langtype、parameter和tag等的含义与前面的叙述相一致,在此不再重复。
    7.5.9 子程序的调用伪指令
    子程序调用伪指令INVOKE与子程序的调用指令CALL在功能上是一致的,但它使汇编语言的子程序调用方法高级语言化,程序员可不用理会一些调用细节问题。
    调用伪指令INVOKE的使用格式如下:
    INVOKE  expression [, arguments]
    其中:expression—地址表达式,通常为子程序名;
    arguments—传递的各参数之间用逗号','分开,参数可以是寄存器、表达式或ADDR 标识符等。
    该伪指令是调用基于堆栈的子程序的方法,它把所有参数压栈,子程序结束时,又把参数自动弹出堆栈。
    在参数传递时,汇编程序将根据子程序的原型进行数据类型检查。若需要进行参数类型转换的话,汇编程序则会自动生成一段代码来满足其数据类型转换的要求。
    例如:
    INVOKE  TEST, AX, 12 34, ADDR MSG
    其中:TEST是子程序名,寄存器AX和表达式“12 34”是参数,“ADDR MSG”是传递变量MSG的地址。
    例7.6 编写一个累加参数数值的子程序。其中参数的个数不定,参数的个数由第一个参数来确定。
    解:
    
    

 
    
 
    
.MODEL  SMALL
    .STACK  256
    .CODE
    
;第一个参数parmcount确定其后面参数parmvalues中所含参数的个数
    
ADDUP
    
PROC  NEAR  C, parmcount:WORD, parmvalues:VARARG
    
XOR
    
AX, AX
    
XOR
    
SI, SI
    
MOV
    
CX, parmcount
    
.REPEAT
    
   ADD  AX, parmvalues[SI]
    ADD  SI, 2
    
.UNTILCXZ
    
RET
    
ADDUP
    
ENDP
    
.STARTUP
    
INVOKE
    
ADDUP, 3, 5, 2, 4
    
;调用子程序ADDUP,计算5 2 4
    
INVOKE
    
ADDUP, 4, 1, 2, 3, 4
    
;调用子程序ADDUP,计算1 2 3 4
    
.EXIT 0
    
.END
    

 
    7.5.10 局部变量的定义
    局部变量的定义格式:
    LOCAL 变量名[[数量]] [:数据类型] [,变量名[[数量]] [:数据类型]]...
    伪指令LOCAL的作用是说明一个或多个临时的局部变量(位于堆栈中)。局部变量必须在任何指令之前加以说明,并可用多个LOCAL伪指令来说明其局部变量。
    在子程序中,若说明了某个局部变量,则子程序体中的指令就可使用该局部变量。汇编程序会把对它的引用转换成用指针寄存器BP来访问其在堆栈中的实际存储单元。
    在局部变量的作用 域与高级语言中局部变量的作用域相一致,即:局部变量只能在当前子程序中使用,离开该子程序,它们就不能再被引用。但在局部变量的命名规则上有所不同,高 级语言中的局部变量可与外层变量同名,而汇编语言中的局部变量不能与其它任何变量同名,否则,在汇编时,将会给出“重定义”(Symbol redefinition)的错误信息。
    “数量”用来说明该变量所具有的元素个数。象高级语言的数组定义一样,该数量必须写在括号“[ ]”之中。“数量”说明项是可选项。
    局部变量的类型说明符可以是任何合法的数据类型说明符。在16位段环境下,该缺省的数据类型是WORD,而在32位段环境下,该缺省的数据类型是DWORD。
    此处伪指令LOCAL的作用与9.3.1节中伪指令LOCAL的作用是完全不同的,具体的差异请见9.3.1节中的比较。
    例如:
    LOCAL  data[20]:BYTE, num:WORD
    在上例的说明中,定义了二个局部变量:data和num。前者是字节类型,并有20个元素,后者是字类型,只有其自身1个元素。
    
    

 

相关新闻

《环境保护名词》
硫和硫的化合物 环境保护5
森林的开发和保护(练习)
利用子程序与中断
操作内存
使用寄存器
任务转换
寄存器使用实例
汇编语言-子程序
字符串处理

您可能对这些感兴趣  

干货分享|10本最受国外孩子喜爱的英文词典——上
从孩子的表现看父母的缺点!请家长对号入座,看看你是哪一类?
20条制作PPT的视觉原则
培训简史:培训者必知的历史轨迹
广田丰管理培训生人才培养调查报告
第4讲 作为上司的职业经理
第3讲 作为同事的职业经理
第2讲 作为下属的职业经理
第1讲 培养经理人的管理素养
酒店前台新员工上岗培训计划

题目筛选器
日期:
类型:
状态:
得分: <=
分类:
作者:
职业:
关键字:
搜索

 
 
 
  焦点事件
 
  知识体系
 
  职业列表
 
 
  最热文章
 
 
  最多引用文章
 
 
  最新文章
 
 
 
 
网站介绍 | 广告服务 | 招聘信息 | 保护隐私权 | 免责条款 | 法律顾问 | 意见反馈
版权所有 不得转载
沪ICP备 10203777 号 联系电话:021-54428255
  帮助提示    
《我的太学》是一种全新的应用,您在操作中遇到疑问或者问题,请拨打电话13564659895,15921448526。
《我的太学》