计算机原理:第三章 汇编语言程序设计3of3_第1页
计算机原理:第三章 汇编语言程序设计3of3_第2页
计算机原理:第三章 汇编语言程序设计3of3_第3页
计算机原理:第三章 汇编语言程序设计3of3_第4页
计算机原理:第三章 汇编语言程序设计3of3_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 1在代码段结束之前(即CODE ENDS之前) 增加两句: MOVAH,4CH INT21H;4CH号的DOS系统功能调用程序结束返回DOS 的非标准方法 2DOS 下直接执行过程(P172 中段)名字 PROC FAR ;远过程 PUSH DS ; 压入返回的CS值 ;即保护PSP(程序段前缀Program Segment Prefix)段地址 MOV AX,0 PUSH AX ;再压入0作偏移地址 ;栈顶为返回地址 RET ;远返回,从栈顶 CS:IP名字 ENDP程序结束返回DOS 的IBM 推荐形式 3程序模块例DATA SEGMENT DATA ENDSSTACK SEGMENT

2、PARA STACK DB 100H DUP(?)STACK ENDSCODE SEGMENT ASSUME CS:CODE, DS:DATA, ES:DATA, SS:STACKEXAM PROC FARSTART: PUSHDS;保护PSP段地址 MOV AX,0 ;保护偏移0地址 PUSHAX RET EXAM ENDPEND STARTDATA SEGMENT DATA ENDSMYSTK SEGMENT PARA STACK DB 100H DUP(?)MYSTK ENDSCODE SEGMENT ASSUME CS:CODE, DS:DATA, ES:DATA, SS:MYSTKE

3、XAM PROC FARSTART: PUSHDS;保护PSP段地址 MOV AX,0 ;保护偏移0地址 PUSHAX RET EXAM ENDPEND START 43.5程序举例P170 【例3.13】数据块传送就是用源数据块去覆盖目标数据块。块1块2应在破坏前先将这部分数据传送走。但当两数据块有部分重叠时,在传送过程中源数据的这部分就可能被破坏。 5P170图3.8 源数据区与目标数据区地址重叠示意图源前先传尾,源后先传头。如何判断源和目标的前后?前后头尾头尾前后 6P171 图3.9 例3.13流程图分别计算出源数据块和目标数据块的起始地址的20位物理地址并由高16位和低4位组成。然后

4、在区分出两数据块的前后的基础上再进行传送。高16位相等源在前 源在后 7数据块转送程序段(P171)Code segment assume CS:CodeBlkmov proc farStart: push DS mov AX, 0 push AX mov AX, SI ;求源(DS:SI)始址高16位 shr AX, 1 ; 逻辑右移(最高位移进0) shr AX, 1 shr AX, 1 shr AX, 1 8 mov DX, DS add AX, DX ; 得高16位 mov DS, AX ; 源(物理)始址高16位送DS and SI, 0FH ; 得低4位(高12位置0) mov B

5、X, DI ; 同样对目标ES:DI shr BX, 1 shr BX, 1 shr BX, 1 shr BX, 1 mov DX, ES add BX, DX 9 mov ES, BX ;目标(物理)始址高16位送ES and DI, 0FH ; 得低4位(高12位置0) cmp AX, BX ja Down ; 源地址高 jb Up ; 源地址低 cmp SI, DI ; 还需看低4位 ja Down ; 源地址高 jb Up ; 源地址低 jmp Exit ; 完全相等 Up: std ; 指针减量,即从高地址开始往上 10 mov AX, CX ; 数据块长度(字节数) dec AX

6、add SI, AX ; 得源末址 add DI, AX ; 得目标末址 jmp Trans Down: cld ; 指针加量,即从低地址开始往下 Trans: rep movsb Exit: ret Blkmov endp Code ends end Start 11P172【例3.14】将36位BCD码转换为ASCII十进制数要求:压缩BCD码每字节表示两位十进制数, 将高4位和低4位拆开后转换成ASCII码显示。多字节数在存储器中存放的次序是低字节在前、 高字节在后。高位开始的0不显示,全0只显示一个0。 12P172 图3.10 例3.14中BCDBUF起始的内容 显示出字符5 6,即

7、56为此:1) 分解成 5和6 2) 求出其ASCII码 35H和36H送显示 显示出12345678901234560显示出123456 13前导0判断MOVDH ,0 ;前导0标志ORDH , ; 当前一位数字出口: DH0 说明是前导0不显示且标志保持 DH 0,说明是数值显示且标志清除 14P173 图3.11 例3.14流程图 15【例3.14】程序 (173页-)Data segmentBcdbuf db 56H,34H,12H,90H,78H,56H,34H,12H db 90H,78H,56H,34H,12H,90H,78H,56H,34H,12HData endsStack

8、segment stack db 100 dup(?)Stack endsCode segment assume CS:Code,DS:Data,SS:StackTrans Proc far 16 Start: push DS mov AX, 0 push AX mov AX, Data mov DS, AX mov CX, 18 ; 装入字节数 lea SI, Bcdbuf add SI, 17 ; 设置末址(从高地址往低地址) mov DH, 0Load: push CX mov AL, SI ; (从后往前)取一个字节 dec SI mov BL, AL ; 暂存入BL 17 mov C

9、L, 4 rol AL, CL ; 经向左循环,把高4位移至低4位 and AL, 0fH ; 取高4位 or DH, AL ; 判断是否为前导0 jz Last ; 是,则不显示 add AL, 30H ; 否则,转换为ASCII码 mov DL, AL ; 输出显示 mov AH, 02 ; 功能号 int 21H ; dos功能调用Last: pop CX ; 剩余循环次数 cmp CX, 1 ; 判断是否为最后字节 jnz Bcdl ; 否 mov DH, 0fH ; 是(且准备处理低4位),则设置标志Bcdl: mov AL, BL ; 取回暂存的字节 and AL, 0fH ; 取

10、低4位 18 or DH, AL jz Goon ; 前导0, 且不为最后字节 add AL, 30H ; 转换为SCII码 mov DL, AL ; 输出显示 mov AH, 02 int 21HGoon: loop Load ; 如CX-10 则继续 retTrans endpCode ends end Start 19程序思考1. 若每次从缓冲区中取一个字,效率更高,如何保证显示的顺序正确? 2.若是16进制数显示,程序如何修改? 20P175【例3.15】多位无符号二进制数的乘法分解成16位乘法的多次循环。此题是2重循环嵌套:一字(16位)乘以被乘数的每一字(内循环)再用乘数的每一字来

11、重复以上过程(外循环)循环嵌套时注意寄存器的保护。此题中的CX。 21P176 图3.14 例3.15的指针分配 22P175 图3.15 计算积之和过程示意图每乘一字,则积长一字 23P176 图3.15 例3.15流程图和的进位(循环)处理 24【例3.15】程序 (177页-)Count equ 3 ; 乘数(被乘数)的字数Data segmentMcand dw 00ffH,11ffH,0011HMcator dw 000aH,1000H,0040HProt dw 6 dup(?)Stack segment stack db 100 dup(?)Stack endsCode segme

12、nt assume CS:Code,DS:Data,ES:Data,SS:Stack 25 Mbmul proc farStart: push DS mov AX, 0 push AX mov AX, Data mov DS, AX mov ES, AX lea SI, Mcand ; 置被乘数地址指针 lea BX, Mcator ; 置乘数地址指针 lea DI, Prot ; 置乘积地址指针 push DI mov AX, 0 26 mov CX, 2*Count cld rep stosw ; 全部乘积单元清零(见93页) pop DI; 上面的stosw改动了DI mov CX, C

13、ountExter: push CX ; 外循环计数入栈 mov DX, BX ; 取一个16位乘数 inc BX inc BX ; 指向下一个乘数 push DI ; 乘积地址入栈 push SI ; 被乘数地址入栈 mov CX, Count 27 Inter: push CX ; 内循环计数入栈push DX ; 一个16位乘数入栈 lodsw ; 取一个被乘数放进AX ; 且SI+2 mul DX ; (AX)*(DX) ; 乘积在DX:AX(见73页) add DI, AX ; 加低位积 inc DI inc DI adc DI, DX ; 加高位积 pop DX ; 恢复原16位乘

14、数 pop CX ; 恢复内循环计数 loop Inter ; 循环次数减1 JNC NOCARRY PUSH DIDOCARRY:INC DI INC DI ADC WORD PTR DI, 0 JC DOCARRY POP DINOCARRY: pop DX ; 恢复原16位乘数= 28 pop SI ; 恢复被乘数指针 pop DI ; 恢复乘积地址指针 inc DI inc DI ; DI+2, 每乘一字,则积长一字 pop CX ; 恢复外循环计数 loop Exter ; 外循环减1 ret Mbmul endp end Start 29P181【例3.17】CRT上的电子钟P18

15、1 图3.17 例3.17流程图P183末行起用到2重循环的软件定时,在主频4.77MHz时执行这段程序大约1秒时间。 DELY PROC MOV AX, 3 X1: MOV CX, 0FFFFH X2: DEC CX JNE X2 DEC AX JNE X1 RET DELY ENDP 301.多处用到显示的BIOS调用 INT 10H2.用到许多宏 CURSOR MACRO ; 设置光标位置 WIN MACRO ; 设置窗口位置及颜色 ASCBCD MACRO ; ASCII BCD INCBCD MACRO ; BCD数加1 BCDASC MACRO ; BCD ASCII STRDSP

16、Y MACRO ; 显示字符串 31【例3.17】程序 (181页-) 。Clock proc far ; 183页中起Start: push DS mov AX, 0 push AX mov AX, Data Win 0,0,24,79,7 Win 9,28,15,52,01010111B ;设置窗口 Cursor 11, 32 ; 设置光标 Strdspy Buf1 ; 显示提示 Current time is: Cursor 13, 36 ; 设置光标Data segmentBuf1 db Curt time is: $Buf2 db 9 db 10 dup(?)Data ends 32

17、 lea DX, Buf2 mov AH, 0aH int 21H ; 从键盘接受时间 HH_MM_SS lea BX, Buf2 ; BX+2始存有输入字符串 Ascbcd CH ; 小时值 Ascbcd DH ; 分值 Ascbcd DL ; 秒值 Timer: call Dely ; 延时1秒 Incbcd DL, 60H ; +1秒,并判定 Incbcd DH, 60H ; +1分,并判定 Incbcd CH, 24H ; +1小时并判定 Dispy: lea BX, Buf2; 小于60时则不要做; 后续判定,直接去显示 33 Bcdasc CH ; 时值BCD-ASCII Bcdasc DH ; 分值BCD-ASCII Bcdasc DL ; 秒值BCD-ASCII inc BX mov AL, $ mov BX, AL push DX Cursor 13,36 Strdspy Buf2+2 ; 显示时间 pop DX jmp Timer 。 34宏Ascbcd (将2个字节的字符转为压缩BCD入Reg)Ascbcd macro Reg inc BX ; 从键盘接受的时间字符

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论