




已阅读5页,还剩36页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1.作业讲评 2.子程序:关注入口参数、出口参数、传递方式。特别注意堆栈的使用及其内容。能描述堆栈变化。,本次课内容,统计AX中1的个数送到CL,0的个数送到CH. 分析 逐位处理,一般可以用移位指令完成. 无论哪种移位,所移出的位都会放在CF中.,问题:,“广泛流传”的版本,code segment assume cs:code start: mov ax,0100100110101001B xor bx,bx mov cx,16 circle: rol ax,1,怎么会有两个loop circle?,jc BitSet inc bh loop circle jmp countover BitSet: inc bl loop circle,其实16位可以一块送,countover: mov ch,bh mov cl,bl mov ax,4c00h int 21h code ends end,该流程图虽然可行,但仍有以下问题: 1.有必要两处判断CX=0吗? 2.同样的代码(loop circle)写了两次. 3.分支与循环结构交叉,易出现错误. 此流程图需要完善。,CF=0 ?,BL-BL+1 CX-CX-1,Y,N,开始,AX-数 CX-16,CX=0 ?,Y,END,AX左移一位,CX=0 ?,Y,N,N,BH-BH+1 CX-CX-1,CX-BX,circle,BitSet,countover,完善流程图,流程图本身不是目的,而是将想法表达为算法,为编写程序代码做准备。 在流程图阶段,应当检查有没有原则性错误。 好的流程图不应当出现交叉的程序结构,更不应存在逻辑错误。 优化流程图,可以提高代码效率。,该流程图合乎规范,表现在: 1.同样的代码(loop circle)只写了一次,效率提高了. 2.分支与循环结构不再交叉,分支结构完全嵌套在循环结构中,不易出现错误. 本流程图很容易转换成代码。,CF=0 ?,BL-BL+1,Y,N,开始,AX-数 CX-16,Y,END,AX左移一位,CX=0 ?,N,BH-BH+1,CX-BX,circle,BitSet,countover,CX-CX-1,Y,修改后的程序,code segment assume cs:code start: mov ax,0100100110101001B xor bx,bx mov cx,16 circle: rol ax,1,分支在循环结构里面,jc BitSet inc bh jmp countover BitSet: inc bl countover: loop circle,现在程序简洁了,mov cx,bx mov ax,4c00h int 21h code ends end,调试程序,1.不要急于输入输出,在DEBUG中也可以查看程序的执行结果,而且更全面。 2.记录程序运行的中间结果,分析其是否正确。如果不正确,要找出问题所在。 3.尽量列表格说明程序执行情况,用直观的手段说明你的观点。,例,说明刚才程序的执行结果:至少要列举3种情况,串(string):顺序放在内存中一组相同类型数据(字/字节) 串操作:对串中的元素进行相同的操作。 串操作的寻址方式(隐含): 源操作数指针DS:SI 目的操作数指针ES:DI(同一段内操作则须ES=DS) 每次串操作后自动修改指针SI和DI : 字节串操作后自动1,字串操作后自动2 (指下一个) CLD令DF=0作 ,STD令DF=1作 。 重复前缀: REP CX0 则重复执行 MOVS/STOS CX减1 REPE/REPZ CX0ZF=1则重复执行CMPS/SCAS CX减1 上次比较相等则继续重复 直至CX=0为止 REPNE/REPNZ CX0ZF=0则重复执行CMPS/SCAS CX减1 上次比较不相等则继续重复 直至CX=0为止,3.3.5 串操作指令 P.67,串操作指令,串是由字节、字、或双字组成的字符或数据序列,存放在存储器中。 基本指令集处理的串长度不超过64K。 串操作常用于数据块的快速移动、比较、搜索和存取,执行一次操作串中一个元 素,配上重复前缀可按条件完成对整个串的操作。,重复前缀,重复前缀指令的名称、汇编格式、重复条件、后续的串指令及操作见下表。 重复前缀也是一条指令,但不能单独使用,需加在串操作指令之前,使 串操作指令重复或条件重复执行,相当于运行一个循环程序; 取串指令LODS一般不加重复前缀,因为重复取出串中的元素送到累加 器Acc无意义(后面取出的数冲掉前面取出的数)。,串指令使用的一般方法,设置源串地址,设置目标串地址,设置串长度,设置操作方向DF,串指令,MOV SI, 源串首地址 (或LEA SI, 源串),MOV DI, 目的串首地址 (或LEA DI, 目的串),MOV CX, 串长度,CLD(或STD),加重复前缀或循环编程实现批处理,重复执行?,MOVSB :(ES:DI)(DS:SI), SI1, DI1 MOVSW :(ES:DI+1、DI)(DS:SI+1、SI),SI2, DI2 例 将1000个字符的字符串从内存的BUFFER1搬移到内存的BUFFER2中去。 MOV SI,OFFSET BUFFER1 ;BUFFER1偏移地址送SI MOV DI,OFFSET BUFFER2 ;BUFFER2偏移地址送DI MOV CX,1000 ;传送个数送CX CLD ;令DF=0,地址自动递增 LR:REP MOVSB ;重复搬移1000个字节 LC: . . . .,3.3.5 1.串传送指令 MOVSB / MOVSW,CLD LR:MOVSB DEC CX JNZ LR LC: . . .,用串传送指令实现数据块传送,MOVSB :(ES:DI)(DS:SI), SI1, DI1 MOVSW :(ES:DI+1、DI)(DS:SI+1、SI),SI2, DI2 例 将1000个字符的字符串从内存的BUFFER1搬移到内存的BUFFER2中去。 MOV SI,OFFSET BUFFER1 ;BUFFER1偏移地址送SI MOV DI,OFFSET BUFFER2 ;BUFFER2偏移地址送DI MOV CX,1000 ;传送个数送CX CLD ;令DF=0,地址自动递增 LR:REP MOVSB ;重复搬移1000个字节 LC: . . . .,3.3.5 1.串传送指令 MOVSB / MOVSW (move),CMPSB :(DS:SI)(ES:DI), SI1, DI1 CMPSW :(DS:SI+1、SI)(ES:DI+1、DI), SI2, DI2 例 比较DEST和SOURCE中的500个字节,找出第一个不相同的字节,如果找到,则将SOURCE中的这个数送AL中。 LEA DI,DEST ; DEST偏移地址送DI LEA SI,SOURCE ; SOURCE偏移地址送SI MOV CX,500 ;比较次数送CX CLD ;令DF=0,地址自动递增 REPE CMPSB ;相同则重复比较直至最后 JZ NEXT ;遇不同或比完:判相同则不存 MACH: DEC SI ;SI退指最后比较不同的那个源数 MOV AL,SI ;送AL NEXT:. . . . 本指令可用来检查两个串是否相等,3.3.5 2.串比较指令 CMPSB / CMPSW (compare),SCASB : (AL)(ES:DI) , DI1 (search) SCASW :(AX)(ES:DI+1、DI), DI2 例 在包含100个字符的字符串中寻找第一个回车符CR(其ASCII码为0DH),找到后将其地址保留在(DS:DI)中,并在屏幕上显示“Y”,否则显示“N” 。 LEA DI,STRING ; STRING偏移地址送DI MOV AL,0DH ;关键字送AL MOV CX,100 ;比较次数送CX CLD ;令DF=0,地址自动递增 REPNE SCASB ;不同则重复比较直至最后 JZ FOUND ;遇相同或比完:判相同则转 MOV DL,N ;不存在回车:显示“N” JMP DSPY FOUND : DEC DI ;SI退指找到回车的那个单元 MOV DL,Y ;显示“Y” DSPY:MOV AH,02H ;调用2号软中断输出显示 INT 21H . . . . 本指令用于在串中查找指定的信息,3.3.5 3.串搜索(扫描)指令 SCASB / SCASW,MOV AX,DATA MOV DS,AX MOV ES,AX,; 在100个字符中找回车符 .MODEL SMALL ;小模式 .DATA ;数据段 STRING DB HOW DO YOU DO!,0DH,34H, 43H,37H, 41H,0DH .STACK 200 ;堆栈段,预留200字节 .CODE ;代码段 START:MOV AX,DATA MOV DS,AX ;数据段赋值 MOV ES,AX ;附加段赋值 MOV DI,OFFSET STRING ;STRING偏移地址送DI MOV AL,0DH ;关键字送AL MOV CX,100 ;比较次数送CX CLD ;令DF=0,地址自动递增 REPNE SCASB ;不同则重复比较直至最后 JZ FOUND ;遇相同或比完:判相同则转 MOV DL,N ;不存在回车:显示“N” JMP DSPY FOUND:DEC DI ;SI退指找到回车的那个单元 MOV DL,Y ;显示“Y” DSPY: MOV AH,02H ;调用2号软中断输出显示 INT 21H MOV AH,4CH ;返回DOS INT 21H END START ;汇编结束,LODSB :(AL)(DS:SI), SI1 LODSW :(AX)(DS:SI+1、SI), SI2 例 内存中以BUFFER为首址的缓冲区有10个以非压缩型BCD码形式存放的十进制数,它们的值可能是09中的任意一个,将这些十进制数按顺序显示在屏幕上。 LEA SI,BUFFER ;BUFFER偏移地址送DI MOV CX,10 ;数据个数送CX MOV AH,02H ;置2号DOS功能调用 CLD ;令DF=0,地址自动递增 GET: LODSB ;用串装入指令取一个BCD码到AL OR AL,30H ;转换为ASCII码 MOV DL,AL ;送DL INT 21H ;输出显示 DEC CX ;循环计数 JNZ GET ;未完继续 MOV AH,4CH ;返回DOS INT 21H . . . .,3.3.5 4.串装入指令 LODSB /LODSW (load) 从内存串数据逐个装入到CPU的AL里来,使用重复前缀没有意义,MOV AL,SI INC SI,STOSB :(ES:DI)AL, DI1 STOSW :(ES:DI+1、DI)AX, DI2 例 用STOS 指令将字符“#”装入到以AREA为首地址的 100个字节中。 LEA DI,AREA LEA DI,AREA MOV AX,# MOV AX,# MOV CX,50 MOV CX,50 CLD CLD REP STOSW REP STOSB MOV AH,4CH MOV AH,4CH INT 21H INT 21H STOS指令加重复前缀通常用于初始化一个内存区域,3.3.5 5.串存储指令 STOSB / STOSW (store),;习题 求100个8位补码数平均值及小于平均值的数的个数 .MODEL SMALL ;小模式 .DATA ;数据段 BM DB 34,-38,43,-51, 96 DUP(?) N EQU 4 PJ DB ? XG DB ? .STACK 200 ;堆栈段,预留200字节 .CODE ;代码段 START:MOV AX,DATA ;数据段赋值 MOV DS,AX MOV SI,OFFSET BM ;SI指向数组首地址 MOV BX,0 ;累加寄存器清0 MOV CX,N ;对N个数累加 LB1: MOV AL,SI ;取当前单字节补码数到AL CBW ;扩展为字在AX ADD BX,AX ;加到BX中 INC SI ;SI指向下一个数 LOOP LB1 ;循环,MOV AX,BX ;累加和送AX MOV CL,N ;置除数N IDIV CL ;除以+100得平均值于AL CBW ;扩展为字在AX MOV PJ,AL ;存平均值 MOV BL,0 ;计个数寄存器清0 MOV SI,OFFSET BM ;SI重新指向数组首地址 MOV CX,N ;对100个数统计 LB2: CMP AL,SI ;平均值与当前补码数比较 JLE LB3 ;:不计 INC BL ;当前补码数小:BX计数加1 LB3: INC SI ;SI指向下一个数 LOOP LB2 ;循环 MOV XG,BL ;存小于平均值的个数 MOV AH,4CH ;返回DOS INT 21H END START,4.2.5 子程序设计 P.103,子程序(过程)的定义及结构 (设过程名SUB1,NEAR属性),SUB1 PROC NEAR ;过程定义伪指令 PUSH AX ;保护现场(子程序中需要改变的寄存器) PUSHF PUSH BX . . . POP BX ;恢复现场 POPF POP AX RET ;子程序返回 SUB1 ENDP 过程的类型属性缺省为NEAR(段内),段间调用则为FAR属性,关于子程序的一些要素 子程序: 保护现场与恢复现场(子程序内会破坏的寄存器); 利用主程序传递的入口参数; 子程序的处理功能(公用性、专门化); 处理结果数据通过出口参数传递给主程序。 主程序调用过程: 入口参数初始化; 调用子程序:CALL 过程名 ; 出口参数利用与处理;,4.2.5子程序设计例 (一),例 在BCDZ单元中有一个2位十进制数的压缩BCD码,试编程将其转换成二进制数,并保存到BINZ单元。 分析: 子程序SUB1的处理功能:将AL中的2位压缩BCD码转化为二进制数存回AL。 入口参数: 要转化的单字节压缩BCD码AL 出口参数:转化好的二进制结果AL 保护现场:F、BX、CX 主、子程序共用寄存器:AL,MOV AH,AL ;取BCD码 MOV BL,AL AND AH,0FH ;保留低四位的个位码 AND BL,0FH MOV BL,AH ;个位BCD码保存在BL MOV CL,04H ; SHR AL,CL ;十位BCD码移至低四位 MOV BH,10 ;设乘数10于BH MUL BH ;AL中十位码乘10 ADD AL,BL ;加上个位码得二进制结果于AL中,SUB1子程序主体程序段:,本例通过寄存器传递参数!,4.2.5子程序设计例 (二),例 在一个带有符号的数组中选出绝对值最大的值,并找出该值所在的位置,分别存在MAX和INDEX单元中。 分析变量定义及建立的参数表: 0000H ARRAY DW 1,20,-5, ;数组假设100个2单元 00C8H COUNT EQU ($-ARRAY)/2 ;计算数组长度(元素个数):0064H 00C8H MAX DW ? ;存放绝对值最大元素的原值 00CAH INDEX DB ? ;存放绝对值最大元素的序号 00CBH TAB:DW ARRAY , COUNT , MAX , INDEX II 表内值: 0000H , 0064H , 00C8H , 00CAH BX 表内址:以BX取 以BX+2取 以BX+4取 以BX+6取,本例通过建立的参数表传递参数!,MOV DH,1 ;元素序号跟踪计数初值 MOV DL,0 ;存放序号,清0 MOV SI,BX ;取数组首址ARRAY MOV CX,BX+2 ;取数组元素个数COUNT DEC CX ;循环次数少1 LODSW ;取首个元素到AX ADD AX,0 ;转化为绝对值 JNS NUM0 NEG AX MOV DI,AX ;首个元素绝对值进最大绝对值寄存器 NUM0:LODSW ;取DI指向的新一个元素到AX,DI加2 ADD AX,0 ;转化为绝对值 JNS NUM0 NEG AX,例 SUB1子程序主体程序段:,MOV DI,0;极小绝 对值,NUM1:CMP DI,AX ;与新元素比较 JNC NEXT ;新元素不大,维持不变,转 MOV DI,AX ;新元素大则进入DI MOV DL,DH ;新元素大则同时记存其序号 NEXT:INC DH ;元素序号跟踪计数加1 LOOP NUM0 ;未完继续循环 MOV SI,BX+6 ;比完,取最大元素序号INDEX单元地址 MOV SI,DL ;存最大绝对值元素序号 MOV SI,BX ;再取数组首址,SI重新指向数组头 MOV DH,0 ;最大绝对值元素序号扩为字:DX SHL DX,1 ;最大绝对值元素序号乘2 ADD SI,DX ;相加指向最大绝对值元素 MOV AX,SI ;取最大绝对值元素原值 MOV DI, BX+4 ;取最大绝对值MAX单元地址 MOV DI,AX ;存最大绝对值元素值,MOV BX,SI,MOV SI,DX,JGE,增:,BX+SI,SI,例 在DAT1和DAT2分别开始的连续8个单元中存放了两个16位十进制数的压缩BCD码,试编程将其求和,并存放在SUM开始的连续10个单元中。 主程序: .model small .data dat1 db 34h,67h,98h,86h,02h,41h,59h,23h dat2 db 33h,76h,89h,90h,05h,07h,65h,12h,4.2.5子程序设计例 (三),sum db 10 dup(0) .code mov ax,data mov ds,ax mov ax,offset sum push ax mov ax,offset dat2 push ax mov ax,offset dat1 push ax,4.2.5子程序设计例 (三续),call addp mov ah,4ch int 21h addp proc near push bp mov bp,sp mov cx,8 mov si,bp+4 mov di,bp+6,4.2.5子程序设计例 (三续),本例通过堆栈传递参数或参数地址! (画出参数在堆栈中的位置),mov bx,bp+8 clc again: mov al,si adc al,di daa mov bx,al i
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025至2031年中国2MM格法玻璃行业投资前景及策略咨询研究报告
- 2025至2030年中国过滤槽数据监测研究报告
- 2025木材采购合同协议范本下载
- 2025至2030年中国组合螺钉旋具数据监测研究报告
- 2025至2030年中国碾米设备数据监测研究报告
- 2025至2030年中国电位器式位移传感器数据监测研究报告
- 2025至2030年中国消防腰斧数据监测研究报告
- 新建轻质砖墙体施工方案
- 齐河简易轻钢房施工方案
- 梁平酒店铝单板施工方案
- 新时代社区治理存在的问题及对策研究-以XX社区为例
- 《西方经济学》说课
- 安标受控件采购管理制度
- 《针灸神奇作用》课件
- 美国医疗的社会变迁
- 亚低温的治疗与护理
- 2023全新混凝土罐车运输安全协议
- 防高坠自查自纠台账
- 市政工程消耗量定额 zya1-31-2015
- 汽车托管租赁合同
- 国家开放大学《土木工程力学(本)》形考作业1-5参考答案
评论
0/150
提交评论