




已阅读5页,还剩60页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
子程序调用指令CALL,CALL指令用在主程序中,实现子程序的调用 分成段内调用(近调用)和段间调用(远调用) 目标地址采用相对寻址、直接寻址或间接寻址 入栈返回地址:将CALL下一条指令的地址压入堆栈 16位段段内:16位偏移地址,段间:再加16位段地址 32位段段内:32位偏移地址,段间:再将16位段选择器零位扩展为32位保存到堆栈,CALL label ;调用标号指定的子程序 CALL reg16/reg32 ;调用寄存器指定地址的子程序 CALL mem16/mem32 ;调用存储单元指定地址的子程序,子程序返回指令RET,RET指令用在子程序结束,实现返回主程序 RET ;无参数返回:出栈返回地址 RET i16 ;有参数返回:出栈返回地址,ESPESPi16,过程定义,过程定义伪指令获得子程序信息 过程名 PROC ;过程体 过程名 ENDP ;过程名为符合语法的标识符 PROC后面可加参数:NEAR或FAR,CSEG SEGMENT ASSUME CS:CSEG START: . CALL SUBT . MOV AH,4CH INT 21H SUBT PROC (NEAR) . RET SUBT ENDP CSEG ENDS END START,子程序设计,利用过程定义,获得子程序名和调用属性 RET指令返回主程序,CALL指令调用子程序 压入和弹出操作要成对使用,保持堆栈平衡 开始保护寄存器,返回前相应恢复 安排在代码段的主程序之外 子程序允许嵌套和递归 可共用一个数据段,也可具有独立数据段,最好有完整的注释,难点是参数传递,子程序的参数传递,主程序与子程序间通过参数传递建立联系 入口参数(输入参数):主程序子程序 出口参数(输出参数):子程序主程序 传递参数的多少反映程序模块间的耦合程度 参数的具体内容 数据本身(传递数值) 数据的存储地址(传递地址,传递引用) 参数传递方法:寄存器、变量或堆栈,寄存器传递参数(例5-16),最简单和常用的参数传递方法 把参数存于约定的寄存器 少量数据直接传递数值 大量数据只能传递地址 带有出口参数的寄存器不保护 带有入口参数的寄存器可以保护、也可以不保护,但最好能够保持一致,例题5-16字符串显示程序-1,;数据段 msg db Well, I made it !,0 ;代码段(主程序) mov si,offset msg ;主程序提供显示字符串 call dpstri ;调用子程序 mov ah,4ch int 21h,寄存器 地址参数传递,例题5-16字符串显示程序-2,;代码段(子程序) dpstri proc ;子程序:显示字符串 push ax ;寄存器保护 dps1: mov al,si ;取显示字符 cmp al,0 ;是结尾,则显示结束 jz dps2 call dpchar ;调用字符显示子程序 inc si jmp dps1 dps2: pop ax ;寄存器恢复 ret dpstri endp,寄存器 数值参数传递,例题5-16字符串显示程序-3,dpchar proc ;子程序显示字符 push ax ;顺序入栈,保护寄存器 push dx mov ah,2 mov dl,al ;显示一个字符 int 21h pop dx ;逆序出栈,恢复寄存器 pop ax ret dpchar endp,共享变量传递参数,子程序和主程序使用同一个变量名存取数据 变量定义和使用不在同一个源程序中,需要利用PUBLIC、EXTREN声明 共享变量传递参数,子程序的通用性较差 特别适合在多个程序段间、尤其在不同的程序模块间传递数据,例题5-19有符号十进制数输出程序-1,算法如下: 首先判断数据是零、正数或负数,是零显示“0”退出; 是负数,显示“”,求数据的绝对值; 接着数据除以10,余数加30H转换为ASCII码压入堆栈; 重复第3步,直到商为0结束; 依次从堆栈弹出各位数字,进行显示,例题5-19有符号十进制数输出程序-2,mov ecx,count mov ebx,0 again: mov eax,arrayebx*4 mov dtemp,eax ;入口参数存放到共享变量 call dispsid ;调用子程序显示一个数据 inc ebx call dpcrlf ;光标回车换行 loop again,例题5-19有符号十进制数输出程序-3,dispsid proc ;显示有符号十进制数子程序 push eax ;入口参数:共享变量DTEMP push ebx push edx mov eax,dtemp ;取出显示数据 test eax,eax ;判断数据是零、正数或负数 jnz dsid1 mov dl,0 ;是零,显示“0”后退出 mov ah,2 int 21h jmp dsid5,例题5-19有符号十进制数输出程序-4,dsid1: jns dsid2 ;是负数,显示“-” mov ebx,eax ;EAX数据暂存于EBX mov dl,- mov ah,2 int 21h mov eax,ebx neg eax ;数据求补(绝对值),例题5-19有符号十进制数输出程序-5,dsid2: mov ebx,10 push bx ;10压入堆栈,作为退出标志 dsid3: cmp eax,0 ;数据(商)为零,转向显示 jz dsid4 sub edx,edx ;扩展被除数EDX.EAX div ebx ;数据除以10:EDX.EAX10 add dl,30h ;余数(09)转换为ASCII码 push dx ;数据先低位后高位压入堆栈 jmp dsid3,例题5-19有符号十进制数输出程序-6,dsid4: pop dx ;数据先高位后低位弹出堆栈 cmp dl,10 ;是结束标志10,则退出 je dsid5 mov ah,2 ;进行显示 int 21h jmp dsid4 dsid5: pop edx pop ebx pop eax ret ;子程序返回 dispsid endp,字符串输入功能,例题5-12输入字符串大小写转换程序-1,;数据段 keynum = 255 keybuf db keynum ;键盘输入缓冲区 db 0 db keynum dup(0) ;代码段 mov dx,offset keybuf ;设置入口参数DX mov ah,0ah int 21h ;用户用回车键结束 mov dl,0ah ;回车后再进行换行 mov ah,2 int 21h,输入“Hi”,回车,缓冲区: FF 02 48 69 0D 00 ,例题5-12输入字符串大小写转换程序-2,mov bx,offset keybuf+1 ;输入字符个数 mov cl,bx mov ch,0 ;作为循环的次数 again: inc bx ;BX指向输入字符 mov dl,bx ;取出一个字符 cmp dl,a ;小于小写字母“a” jb disp cmp dl,z ;大于小写字母“z” ja disp ;直接去显示 sub dl,20h ;小写字母转换为大写字母 disp: mov ah,2 ;显示一个字符 int 21h loop again ;循环,计数控制循环,堆栈传递参数,主程序将入口参数压入堆栈,子程序从堆栈中取出参数 子程序将出口参数压入堆栈,主程序弹出堆栈取得它们 采用堆栈传递参数是程式化的,它是编译程序处理参数传递、以及汇编语言与高级语言混合编程时的常规方法,例题5-20计算有符号数平均值程序-1,算法如下: 被加数进行符号扩展 求和 除以数据个数得到平均值 32位有符号数扩展到64位,32位表示数据个数(最大232 ) ,不会溢出,例题5-20计算有符号数平均值程序-2,mov eax,count push eax ;压入数据个数(0表示232个) mov ebx,offset array push ebx ;压入缓冲区的偏移地址 call mean ;调用子程序,求平均值 add esp,8 ;平衡堆栈 mov dmed,eax ;保存出口参数,例题5-20计算有符号数平均值程序-3,mean proc ;计算有符号数平均值 push ebp mov ebp,esp push ebx ;保护寄存器 push ecx push edx push esi push edi mov ebx,ebp+6 ;从堆栈取偏移地址 mov ecx,ebp+10 ;从堆栈取数据个数,例题5-20计算有符号数平均值程序-4,xor esi,esi ;ESI保存求和的低32位值 mov edi,esi ;EDI保存求和的高32位值 mean1: mov eax,ebx ;取出一个数据EAX cdq ;符号扩展EDX.EAX add esi,eax ;求和低32位 adc edi,edx ;求和高32位 add ebx,4 ;指向下一个数据 loop mean1 ;循环 mov eax,esi ;累加和在EDX.EAX mov edx,edi,例题5-20计算有符号数平均值程序-5,mov ecx,ebp+10 ;数据个数在CX idiv ecx ;有符号数除法,EAX平均值(EDX余数) pop edi ;恢复寄存器 pop esi pop edx pop ecx pop ebx pop ebp ret mean endp,第6章 微处理器外部特性,6.1 8086的引脚信号 6.1.1 地址/数据信号 6.1.2 读写控制信号 6.1.3 其他控制信号 6.2 8086的总线时序 6.2.1 写总线周期 6.2.2 读总线周期 6.3 奔腾微处理器引脚和时序 6.3.1 引脚定义 6.3.2 总线周期 6.4 微机系统总线 6.4.1 微机总线技术 6.4.2 ISA总线 6.4.3 PCI总线,CPU,外设、存储器,地址,数据,控制,运算单元,控制单元,微型计算机系统硬件结构,1. 微处理器 2. 存储器 3. I/O接口和I/O设备 4. 系统总线,控制总线CB,数据总线DB,地址总线AB,微处理器,I/O设备,I/O接口,存储器,系统总线BUS,处理器总线,数据总线(DB:Data Bus) 处理器与存储器或外设交换信息的通道 个数(条数)是一次能够传送数据的二进制位数 地址总线(AB:Address Bus) 指定存储器或外设的具体单元 个数反映访问的主存储器容量或外设范围 控制总线(CB:Control Bus) 控制处理器数据传送等操作,一个信号两种状态(高或低)两种编码(1或0),引脚信号,信号的功能 用英文单词或英文缩写表示引脚名称 信号的流向 微处理器输出到外部,从外部输入到微处理器内部 有效方式 低电平有效,高电平有效,上升沿或下降沿有效 高电平和低电平都有效 三态能力 高阻状态放弃对引脚的控制 其他设备控制该引脚,总线信号图形表示,单一信号 用单线表示,实线高低表示电平高低,虚线表示状态任意; 成组信号 用高低双线表示,两线交叉表示成组信号改变。双线变为一条居中横线表示输出高阻状态。,总线复用,同一引脚在不同时刻具有不同功能,最常复用:地址引脚数据引脚 目的:减少引脚个数,8086的数据总线和地址总线,AD15AD0(Address/Data) 地址/数据分时复用引脚,共16个引脚 单向输出地址总线,双向数据总线,三态输出,8086的数据总线和地址总线,AD15AD0(Address/Data) 地址/数据分时复用引脚,共16个引脚 单向输出地址总线,双向数据总线,三态输出 A19/S6A16/S3(Address/Status) 地址/状态分时复用引脚,4个三态输出信号 输出高4位地址,输出状态信号,8086的数据总线和地址总线,AD15AD0(Address/Data) 地址/数据分时复用引脚,共16个引脚 单向输出地址总线,双向数据总线,三态输出 A19/S6A16/S3(Address/Status) 地址/状态分时复用引脚,4个三态输出信号 输出高4位地址,输出状态信号 ALE(Address Latch Enable) 地址锁存允许,三态、输出、高电平有效 有效时,表示复用引脚正在传送地址信号,8086的基本读写引脚,WR*(Write) 写控制,三态、输出、低电平有效 有效时,表示微处理器正将数据写到存储单元或I/O端口 RD*(Read) 读控制,三态、输出、低电平有效 有效时,表示微处理器正从存储单元或I/O端口读取数据 M/IO*(Memory/Input and Output) 访问存储器或者I/O,三态、输出、高低电平均有效 高电平(M),表示微处理器访问存储器 低电平时(IO*),表示微处理器访问I/O端口,基本总线操作,存储器读(Memory Read) 微处理器从存储器读取代码或读取操作数 每条指令执行前都需从主存取指 以存储单元为源操作数的指令在执行时 存储器写(Memory Write) 微处理器向存储器写入操作数 以存储单元为目的操作数的指令在执行时,CPU,地址,数据,控制,专用寄存器,通用寄存器,地址就是号码,CPU,A0A19地址,AD0AD15数据,ALE,RD/WR,M/IO*,总线时序,总线时序(Timing) 描述总线信号随时间变化的规律以及总线信号间的相互关系 采用时序图形象化地表现时序 指令周期 一条指令从取指、译码到最终执行完成的过程 总线周期或机器周期 伴随有数据交换的总线操作 T状态 微处理器的基本工作节拍,对应时钟周期,8086的写总线周期,完成对存储器或I/O端口的一次写操作 T1状态 输出20位存储器地址A19A0 M/IO*输出高电平,表示存储器操作 或者M/IO*输出低电平,表示I/O操作 ALE输出正脉冲,表示复用总线输出地址 T2状态 输出控制信号WR*和数据D15D0 T3状态 检测数据传送是否能够完成 T4状态 完成数据传送,MOV mem, imm/reg,M/IO*为高,8086的读总线周期,完成对存储器或I/O端口的一次读操作 T1状态 输出20位存储器地址A19A0 M/IO*输出高电平,表示存储器操作 或者M/IO*输出低电平,表示I/O操作 ALE输出正脉冲,表示复用总线输出地址 T2状态 输出控制信号RD*,存储器或I/O端口发送数据 T3状态和Tw状态 检测数据传送是否能够完成 T4状态 获取数据,完成传送,MOV reg, mem,M/IO*为高,BHE*/S7(Byte High Enable/Status) 高字节允许/状态分时复用引脚,三态输出信号 输出低有效表示传送高字节数据,输出状态信号,I/O读(Input/Output Read) 只有执行输入指令IN时才有 微处理器从外设读取操作数 I/O写(Input/Output Write) 微处理器向外设写出操作数 只有执行输出指令OUT时才有,基本总线操作,OUT DX/i8, AL/AX/EAX,M/IO*为低,IN AL/AX/EAX, DX/i8,M/IO*为低,等待状态,微处理器运行速度远远快于存储器和I/O端口 控制READY信号为低无效,不进入T4状态,插入等待状态Tw Tw状态:引脚信号延续T3时的状态 一个Tw状态的长度是一个时钟周期 在Tw的前沿,继续对READY进行测试 无效继续插入Tw;有效时转入T4状态,同步操作引脚,同步操作 读写操作要保证存储器或外设与微处理器速度一致 否则,慢速的I/O或存储器发出一个信号 让快速的微处理器等待 READY 就绪(准备好) 输入信号,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 集体宿舍安全协议书
- 兄妹拆迁补偿协议书
- 餐厅餐包合同协议书
- 解除房屋卖买协议书
- 饭馆雇主担保协议书
- 项目理财服务协议书
- 银行公安合作协议书
- 酒吧商家活动协议书
- 院子地砖购买协议书
- 食品产品运输协议书
- 《骆驼祥子》中“虎妞”形象分析6200字(论文)
- 《质量管理体系国家注册审核员预备知识培训教程》
- 制冷机采购合同格式
- 2024年5月26日河南省事业单位联考《公共基础知识》试题
- 儿歌大全100首歌词
- 《论语》导读(复旦版)学习通超星期末考试答案章节答案2024年
- 粮油食材配送投标方案(大米食用油食材配送服务投标方案)(技术方案)
- 2024年江西省高考物理+化学+生物试卷(真题+答案)
- 2024年6月高等学校英语应用能力考试B级真题2
- 个人独资企业(合伙企业)转型有限责任公司登记申请书
- 2024年重庆市中考英语试卷真题B卷(含标准答案及解析)+听力音频
评论
0/150
提交评论