1 / 82

第四章 汇编语言程序设计 3 - 5

第四章 汇编语言程序设计 3 - 5. 一、顺序结构程序设计. 二、分支结构程序设计. 四、码转换程序设计. 三、循环程序设计. 五、列和表. 六、子程序. 七、参数传递技术. 习题 : 4 - 4 , 4 - 6 , 4 - 8 4 - 11 , 4 - 13 , 4 - 16. 例:内存中 TABLE 开始存放 0~9 的平方值,通过人机对话,当任给定一个 X ( 0~9 ),查表得 X 的平方值,放在 AL 中。. DATA SEGMENT

mercia
Download Presentation

第四章 汇编语言程序设计 3 - 5

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第四章 汇编语言程序设计3-5 一、顺序结构程序设计 二、分支结构程序设计 四、码转换程序设计 三、循环程序设计 五、列和表 六、子程序 七、参数传递技术 习题: 4-4,4-6,4-8 4-11, 4-13,4-16

  2. 例:内存中TABLE开始存放0~9的平方值,通过人机对话,当任给定一个X(0~9),查表得X的平方值,放在AL中。例:内存中TABLE开始存放0~9的平方值,通过人机对话,当任给定一个X(0~9),查表得X的平方值,放在AL中。 DATA SEGMENT TABLE DB 0,1,4,9,16,25,36,49,64,81 BUF DB ‘Please input one number:’,0DH,0AH,’$‘ DATA ENDS STACK SEGMENT PARA STACK ’ STACK‘ DB 50 DUP(?) TOP THIS WORD STACK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS: STACK MAIN PROC FAR 段定义语句:将一个逻辑段定义成一个整体 定位类型:指定段的起始地址 分类名 指定段的类型 定义TOP为栈底名,类型为字 段分配语句

  3. START: MOV AX,DATA ;送数据段段地址 MOV DS,AX MOV AX,STACK ;送堆栈段段地址 MOV SS,AX MOV SP, OFFSET TOP ;堆栈段偏移量送SP MOV BX,OFFSET TABLE ;平方表有效地址送BX NEXT: MOV DX,OFFSET BUF ;提示输入一个数 MOV AH,9 ; 9号功能调用,(显示字符串) INT 21 MOV AH,1 ;1号功能调用,(输入字符并显示) INT 21 ;键入数送入AL MOV AH,0 AND AL, 0FH ;屏蔽高四位 ADD BX,AX ;表首加偏移量 MOV AL,[BX] ;查表得平方值送AL MOV AH,4CH ;带参数返回DOS INT 21H RET ;返回DOS MAIN ENDP ;过程MAIN结束 CODE ENDS ;代码段结束 END START ;汇编结束

  4. 4-1 汇编语言程序格式 一、指令性语句 格式: 标号: 指令助记符 操作数,操作数 ;注释 二、伪指令语句 格式: 名字 伪指令指示符 操作数,操作数 ;注释

  5. 三、数据项 汇编语言中使用的有常数、变量和标号三种基本数据项。 1. 常数 常数必须是固定值,没有属性,是确定的数据。对于字符串,用单引号括起来的ASCII码表示。 2. 变量 变量通常指数据存放在存储单元中的值,在程序中是可以修改。变量都具有三种属性。 段值(SEGMENT):变量所在段的段基址; 段内偏移地址(OFFSET):变量所在地址与所在段的段基址之间的地址偏移字节数; 类型(TYPE):变量的类型属性是指变量中每个元素所包含的字节数。

  6. 3. 标号 标号是可执行语句的地址的符号表示,它可作为转移指令和调用指令CALL的目的操作数,以确定程序转向的目的地址。它具有三种属性。 段值(SEGMENT):标号所在段的段基址; 段内偏移地址(OFFSET):标号所在地址与所在段的段基址之间的地址偏移字节数; 类型(TYPE):标号的类型属性是指在转移指令中标号可转移的距离(距离属性NEAR,FAR)。

  7. 4-2 MASM中的表达式 表达式由运算对象及运算符组成,在汇编时由汇编程序对它进行运算,运算结果作为一个语句的操作数使用。运算对象可以是常数、变量或标号,得到的运算结果可以是一个常数字,也可以是一个存储器的地址,在此地址中存放了数据(称为变量)或指令。 一、算术运算符 符号 名称 运算结果 + 加法 和 - 减法 差 * 乘法 乘积 / 除法 商 MOD 模除 余数 SHL 左移 左移后二进制 SHR 右移 右移后二进制

  8. 符号 名称 运算结果 AND 与运算 逻辑与结果 OR 或运算 逻辑或结果 XOR 异或运算 逻辑异或结果 NOT 非运算 逻辑非结果 符号 名称 运算结果 EQ 相等 NE 不相等 LT 小于 结果为真输出全“1” LE 小于等于 结果为假输出全“0” GT 大于 GE 大于等于 二、逻辑运算符 三、关系运算符

  9. 符号 名称 运算结果 OFFSET 返回偏移地址 偏移地址 SEG 返回段基址 段基址 TYPE 返回元素字节数 字节数 LENGTH 返回变量单元数 单元数 SIZE 返回变量总字节数 总字节数 符号 名称 运算结果 段寄存器名: 段前缀 修改段 PTR 修改类型属性 修改后类型 THIS 指定类型/距离属性 指定后类型 HIGH 分离高字节 高字节 LOW 分离低字节 低字节SIZE SHORT 短转移说明 -128--127字节间转移 四、数值返回 五、修改属性

  10. 符号 名称 运算结果 () 圆括号 改变运算符优先级 [ ] 方括号 下标或间接寻址 ·点运算符 连接结构与变量 <> 尖括号 修改变量 MASK 记录位图 位图形 WIDTH 记录宽度 记录字段位数 六、其它运算符

  11. 4-3 伪指令语句 伪指令语句没有对应的机器代码,并不像指令语句那样由CPU来执行,它是由MASM汇编程序对源程序汇编期间进行处理的。主要完成变量定义、内存分配、指示程序开始和结束等。 数据定义语句:DB、DW、DD、DQ、DT 标号赋值语句:EQU、= 段定义语句:SEGMENT…ENDS 段分配语句:ASSUME 过程定义语句:PROC …ENDP 程序开始、结束语句:ORG、END、NAME

  12. 4-4 DOS系统功能调用 DOS是PC/XT的操作系统,负责管理系统的所有资源,DOS中包括了许多可供用户调用的子程序。 用户调用DOS功能的途径: * 在DOS环境下,键入DOS命令; * 通过用户程序调用DOS和BIOS中的服务程序。 INT n是一条软中断指令,该指令执行一次就调用一个相应的中断服务程序。 其中: n= 0 ~ 4 ; 8088/8086CPU占用 n= 5 ~ 1FH ; 为BIOS的各功能子程序 n= 20 ~ 3FH ; 为DOS的各功能子程序 其中INT 21是一个具有100多个子功能的中断服务程序,分别用于设备管理,目录管理,文件管理及其它功能。

  13. 功能号n AH 置入口参数 执行INT 21H 分析出口参数 常用DOS功能表 INT 21的使用方法:

  14. 显示提示 DO YOU WANT TO INPUT STRING?(Y/N) 等待键盘输入应答 Y/N N 键盘输入Y 内存区长度20H BUFIN 显示提示 PLEASE INPUT STRING 实际输入字符串长度 BUFIN+1 BUFIN+2=BUFINI 键盘输入字符串存入BUFIN 输入字符1 输入字符2 计算输入字符串长度,并将字符串结尾加$ : : 显示输入的字符串 输入字符n 回车符$ DONE 返回DOS 功能号AH 例:通过人机对话从键盘输入一字符串,存入BUFIN为首地址的内存区,并在显示器显示该字符串。 09H 01H 09H 0AH 09H 4CH

  15. DATA SEGMENT STRING1 DB ‘DO YOU WANT TO INPUT ’ DB ‘STRING?(Y/N)’,0DH,0AH,‘$’ STRING2 DB ‘PLEASE INPUT STRING.’ DB 0DH,0AH,‘$’ BUFIN DB 20H,? ;20H为设置长度,?为实际输入长度 BUFINI DB 20H DUP(?) ;实际输入的字符串存放区 DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA START PROC FAR BEGING:PUSH DS MOV AX,0 PUSH AX MOV AX,DATA MOV DS,AX MOV ES,AX ;定义使用DS,ES LEA DX,STRING1 MOV AH,09H INT 21H ;显示STRING1提示 MOV AH,01H INT 21H ;从键盘输入1个字符至AL

  16. CMP AL,‘Y’ • JNE DONE • LEA DX,STRING2 • MOV AH,09H • INT 21H ;显示STRING2提示 • LEA DX,BUFIN • MOV AH,0AH • INT 21H ;从键盘输入字符串至BUFIN • MOV AL,BUFIN+1 • CBW ;计算BUFIN 末地址 • LEA SI,BUFIN+2 • ADD SI,AX ;SI 指向原输入回车位置 • MOV [SI],‘$’ ;字符串结尾为$ • MOV AH,09H • LEA DX,BUFIN+2 • INT 21H ;显示输入的字符串,无长度 • DONE:RET • START ENDP • CODE ENDS • END BEGIN

  17. 顺序程序结构是一种最简单的程序结构。在流程图中,处理框一个接一个执行,既无分支,也无循环和转移。是一种简单的程序结构。顺序程序结构是一种最简单的程序结构。在流程图中,处理框一个接一个执行,既无分支,也无循环和转移。是一种简单的程序结构。 S 1 S2 S3 4-5 程序设计方法 一、顺序结构

  18. BX+0 +2 +4 +6 +8 +A +C +E B A B A 积1H 积2 积3 * + * D C D * C + 积4 部分积1 和1 B*D + A*D 部分积2 和2H B*C 部分积3 部分积4 A*C 和2L 和3L 和1L 积1L 积1H 和1H 和3H 和2H * 积1 例1:两个32位无符号数的乘法 * + 最后乘积 乘法运算过程示意图

  19. 设地址指针 进位加至部分和1H,存内存 被乘数的低16位B送AX B×C=部分积3 乘数的低16位D送SI 部分积3+部分和1,存内存 乘数的高16位C送DI 存进位 B×D存部分积1 A×C=部分积4 被乘数的高16位A送AX 部分积4+部分和2H+ 进位=和3 A×D=部分积2 存和3 部分积2L+部分积1H 返回

  20. name 32 bit multiply DATA SEGMENT MULNUM DW 0000,0FFFFH,0000,0FFFFH,4DUP( ?) DATA ENDS STACK SEGMENT PARA STACK ’ STACK‘ STAK DB 100 DUP(?) TOP EQU LENGTH STAK STACK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS: STACK, ES :DATA START PROC FAR BEGIN: PUSH DS MOV AX,0 PUSH AX MOV AX, DATA ;送数据段段地址 MOV DS,AX MOV ES, AX MOV AX,STACK ;送堆栈段段地址 MOV SS,AX MOV SP, OFFSET TOP ;堆栈段偏移量送SP

  21. LEA BX,MULNUM MULU32: MOV AX ,[BX] ; B送 AX MOV SI ,[BX+4] ; D送SI MOV DI ,[BX+6] ; C送DI MUL SI ; B*D MOV [BX+8] ,AX ; 保存部分积1 MOV [BX+0AH] ,DX MOV AX ,[BX+2] ; A送AX MUL SI ; A*D ADD AX ,[BX+0AH] ADC DX ,0 ; 部分积2L与部分积1H相加 MOV [BX+0AH] ,AX ; 存和1 MOV [BX+0CH] ,DX MOV AX ,[BX] ; B送AX MUL DI ; C*B,部分积3

  22. ADD AX ,[BX+0AH] ;部分积3与和1相加 ADC DX ,[BX+0CH] MOV [BX+0AH] ,AX ;存和2 MOV [BX+0CH] ,DX PUSHF ;保护进位位 MOV AX ,[BX+2] ; A送 AX MUL SI , ;A×C,得积4 POPF ;恢复进位位 ADC AX , [BX+0CH] ; 部分积4L与和2H相加 ADC DX ,0 MOV [BX+0CH] ,AX MOV [BX+0EH] ,DX ; 存和3 RET START ENDP CODE ENDS END BEGIN

  23. Y 1 (X>0) 0 (X=0) -1 (X<0) 1 X Y= -1 二、分支结构程序设计 1、 分支:分支程序结构要求程序在运行过程中需要根据不同的情况或条件作出判断,并转向相应的处理程序。分支是通过条件转移指令实现的。 例2:根据BUFFER中的数(X)对符号函数BX(Y)赋值。

  24. X→AX 并将AX的特征反映到FLAG Y JE (AX)=0? N N JNS (AX)<0? (AX)=0 (AX)>0 PLUS Y ZERO 1→BX 0FFH→BX 0→BX

  25. 初始化 A 取一字符送AL DH送内存 N (AL)≥30H Y N DL送内存 DH+1 (AL)>39H Y N AL=N-DH-DL (AL) ≥41H Y AL送内存 N DL+1 (AL)>5AH Y RET 修改BX及(CX)-1 N (CX)=0 Y A 例3:在以BUF为首地址的内存,存放着一个长度为N(N<256)的字符串,编程统计其中数字,字母和其它字符的个数,统计数存放在串后三个单元中。 ‘0’—‘9’ 30H—39H ‘A’—’Z’ 41H—5AH 初始化:N送CX; 0送DX; 0送BX; BX为串偏移量, MOV AL,BUF[BX]

  26. 2、多分枝 有的分枝结构为多分枝,可依次测试条件是否满足,若满足条件则转入相应分枝入口,若不满足继续向下测试,直到全部测试完。简单,直观,速度慢。 MOV AH,1 INT 21H ;1号功能调用,键盘输入 CMP AL,‘1’ JE P1 ;键值为1,转P1 CMP AL,‘2’ JE P2 ;键值为2,转P2 CMP AL,‘8’ JE P8 ;键值为8,转P8 JMP ST ;非法键,转停机 P1:… ; 1号键加工子程序 P2:… ; 2号键加工子程序 P8:… ;8号键加工子程序 ST: HLT 例:有8个加工子程序,入口地址分别为P1,P2,… P8。编程实现检测键盘输入命令,使系统分别转向8个加工子程序。 局限性?

  27. 开始 BASE+0 P0L P0H 输入键值 BASE+2 P1L P1H 表首地址BX . . . 求偏移量 P0 . . . 计算地址 P1 . . . 散转 跳转表在内存中的存放方法 3、跳转表实现多分枝 利用跳转表实现多分枝,可以直接找到相应入口,利用该法需建立一个跳转表,表中含每个分枝的入口地址。 MOV BX,OFFSET BASE (1)根据表内地址分枝 跳转表中存放了每个分枝程序的入口地址,只要找到表地址,再将其内容取出,即可得到每个分枝程序的入口地址。 表地址=跳转表首址+偏移地址 AND AL,0FH ADD AL,AL ADD BX,AX JMP WORD PTR [BX]

  28. BASE JMP P1L P1H JMP P2L P2H . . . P1 . . . P2 . . . (2)根据表内指令分枝 跳转表中存放着转移指令,查表后程序执行转移指令将转到相应的子程序去。 MOV AH,1;键入到AL INT 21H AND AL,0FH MOV AH,0 MOV BL,AL ADD AL,AL ADD AL,BL ;偏移量=键值*3 MOV BX,OFFSET BASE ADD BX,AX ;得转移地址 JMP BX ;转入转移指令 转移指令跳转表

  29. BASE 31 P1L 开始 P1H 32 输入关键字 P2L P2H Y 关键字=0 N . . . 首地址送BX P1 . . . 与关键字比较 P2 . . . Y 相等 N 指针加3 转移 (3)根据关键字分枝 跳转表中存放关键字及相应分枝地址。 分枝流程图 关键字跳转表

  30. 10 25 36 48 53 58 70 82 90 98 例4:首地址为BUFFER的数组已按升序排好,长度为N(=10),在数组中查找数M(=80),若找到则从数组中删掉,否则将它插入正确的位置,DX中记录数组最后的长度。 AX=80 CX=10 DX=10 数组中无M 搜索有无关键字 MOV DI,OFFSET BUFFER CLD REPNE SCASW AX≠ CX=9 AX≠ CX=8 AX≠ CX=7 寻找插入位置 SI=2*(DX–1) CMP AX,BUFFER[SI] AX≠ CX=6 AX≠ CX=5 元素下移 MOV BX,BUFFER[SI] MOV BUFFER[SI+2],BX AX≠ CX=4 AX≥ BUFFER[SI-2] AX≠ CX=3 80 AX≠ CX=2 AX≥ BUFFER[SI-2] 插入 MOV BUFFER[SI+2],AX 82 AX≠ CX=1 AX≥ BUFFER[SI-2] 90 AX≥ BUFFER[SI] AX≠ CX=0 98 DX=11

  31. 10 25 36 48 53 58 70 80 90 98 数组中有数M 搜索有无关键字 MOV DI,OFFSET BUFFER CLD REPNE SCASW AX=80 CX=10 DI=BUFFER AX≠ CX=9 DI=BUFFER+2 AX≠ CX=8 DI=BUFFER+4 搜索到,后续元素前移 MOV BX,[DI] MOV [DI-2],BX ADD DI,2 AX≠ CX=7 DI=BUFFER+6 AX≠ CX=6 DI=BUFFER+8 AX≠ CX=5 DI=BUFFER+A AX≠ CX=4 DI=BUFFER+C AX≠ CX=3 DI=BUFFER+E 90 AX = CX=2 DI=BUFFER+10H 98 BX=[DI]=(BUFFER+10H) DI-2 CX-1=1 BX=[DI+2]=(BUFFER+12H) DI-2 CX-1=0 DX=9

  32. 初始化 串扫描查找 Y 找到 N Y (CX)=0 设置串尾比较指针SI N Y 关键字>[SI] DI 所指元素上移 修改比较指针DI N 插在SI所 指单元后 数组元素下移 修改比较指针SI N (CX)-1=0 Y 数组长度+1 数组长度-1 结束 初始化:M送AX; N送CX,DX; 地址偏移量送DI; 增量修改指针 CLD

  33. DATA SEGMENT BUFFER DW 5,10,32,47,53,77,89,106,115,124 N DB 10 M EQU 80 DATA ENDS CODE SEGEMENT ASSUME CS:CODE,DS:DATA,ES:DATA MAIN PROC FAR START: PUSH DS SUB AX,AX PUSH AX MOV AX,DATA MOV DS,AX MOV ES,AX; MOV AX,M ;待查数 送AX MOV CX,N ;数组长度送 CX MOV DX,N MOV DI,OFFSET BUFFER CLD REPNE SCASW ;串扫描查找

  34. JE DEL ;查到,ZF=1 DEC DX ;未查到,插入 MOV SI,DX ;关键字与最后数比较 ADD SI,DX L1: CMP AX,BUFFER[SI] JL L2 ;关键字比数组中某个字小,转L2 MOV BUFFER[SI+2], AX ;大,则插在后面 JMP L3 L2: MOV BX,BUFFER[SI] ;数组下移一位 MOV BUFFER[SI+2], BX SUB SI,2 JMP L1 L3: ADD DX,1 ;修改长度 JMP NEXT1 DEL: JCXZ NEXT ;找到,删此元素 DEL1: MOV BX,[DI] ;其后元素依次前移 MOV [DI-2],BX ADD DI,2 LOOP DEL1 NEXT: DEC DX ;改变数组长度 NEXT1: RET MAIN ENDP CODE ENDS END START

  35. 循环初始化 循环体 循环工作部分 循环工作调整 N 循环结束判断 结 束 三、循环程序设计 循环初始化: 循环程序工作单元的初始化赋值。 循环体:重复执行的一段程序。 循环工作部分: 循环程序的核心。 循环工作调整:重复执行的环境调整。 循环结束判断:每一次循环要有二个出口。根据循环工作调整的情况,判断是否满足结束条件。若满足结束条件,退出循环;若不满足结束条件,继续循环。

  36. AX CMP CMP 大数 BLOCK 大数 1、用计数器控制循环 在循环初始化时设置循环次数→CX。循环体每工作一次,(CX)-1→CX进行调整。当(CX)=0,满足结束条件,退出循环。 例5:存储在BLOCK为首地址内存中100个16bit带符号数,找出最大值后存在MAX单元中。 取一次 比较99次 交换(待定)

  37. NAME FOUND ;定义程序名 DATA SEGMENT ;数据段说明开始 BLOCK DW 65C8H ,-35 ,694AH,……,0A398H COUNT EQU ($-BLOCK)/2 -1 ;$为当前地址 MAX DW ? ;设置MAX的内存空间 DATA ENDS ;数据段说明结束 STACK SEGMENT ;堆栈段说明开始 DB 100 DUP(?) ;保留100字节堆栈空间 STACK ENDS ;堆栈段说明结束 CODE SEGMENT ;代码段说明开始 ASSUME CS:CODE ,DS:DATA,SS:STACK FOUND PROC FAR ; 作为DOS系统的子程序说明BEGIN: PUSH DS ; DOS的DS入栈保护 SUB AX,AX ;DOS的数据段首地址入栈保护 PUSH AX

  38. MOV AX,DATA MOV DS,AX ;设置本程序的DS LEA BX,BLOCK ;本程序的运行程序开始 MOV AX,[BX] INC BX INC BX MOV CX,COUNT AGAIN:CMP AX,[BX] JG NEXT MOV AX,[BX] NEXT: INC BX INC BX LOOP AGAIN MOV MAX,AX ;本程序运行结束 RET ;调用内部中断返回DOS FOUND ENDP ;子程序结束说明 CODE ENDS ;代码段结束说明 END BEGIN ;编译结束说明

  39. X1 = (N / 200 ) + 2 Xi+1=(N / Xi +Xi) / 2 迭代结束条件:X i+1- Xi≤ε。 2、按条件控制循环 当循环次数不确定,则可按循环体工作后是否满足条件的判断确定是否结束循环。按条件控制循环常用于迭代运算或逼近运算。 例6:牛顿逐次逼近迭代运算16bit无符号数的平方根。迭代方程为: 例如,N=90000,则 X1=(90000/200)+2=452 X2=(90000/452+452)/ 2 = 326 X3=(90000/326+326)/ 2 = 301 X4=(90000/301+301)/ 2 = 300

  40. 取N N/200+2=X1 (N/X1+X1)/2=X2 X2-X1= Y =0 N Y =1 N Y = -1 N 存平方根

  41. 3、多重循环 循环中包含另一个循环。每一循环都有各自的循环计数器和终点判断。多重循环程序的设计方法与单循环程序相同,但应注意: * 各重循环的初始条件的控制; * 内循环可以嵌套在外循环中,也可以几个内循环并列在外循环中,但各层循环之间不能交叉,内循环可以跳到外循环中,不可以从外循环直接跳进内层循环; * 不能让循环回到初始条件,以免出现死循环。

  42. 例:气泡法排序。由小到大有序排列以BUFFER为首地址的10个数据无序列,使其成为有序列例:气泡法排序。由小到大有序排列以BUFFER为首地址的10个数据无序列,使其成为有序列 1、排序的关键是比较和交换。 2、每次循环从数组的底部开始比较,每次循环完成一个小数的气泡升顶。 3、排序循环的结束条件是:在循环中未出现过交换。

  43. CONTI 设置交换标志 0BL 取数据串长度 底字地址变址值 SI;循环次数 CX AGAIN 取数Ej Y Ej >=Ej-1 交换;置交换标志-1  BL NEXT 修改变址值 N 比较结束 N 交换标志=0 返回

  44. 1、关于数据段初始化 DATA SEGMENT BUFFER DW 22,-12,…,40 COUNT EQU $-BUFFER; (COUNT=20) DATA ENDS 2、关于比较循环次数 对于10个字数据,比较9次 MOV CX,COUNT MOV SI,CX DEC SI DEC SI;第一次取尾字的变址值 SHR CX,1;20/2=10个字数据 DEC CX;10-1=9次循环 3、关于取数和比较 采用变址寻址,其基地址为 BUFFER的地址。 MOV AX,BUFFER [SI]; ((SI)+OFFSET BUFFER) AX 即Ej AX CMP AX,BUFFER [SI-2]; Ej-Ej-1 PSW 4、关于交换 XCHG AX,BUFFER [SI-2] MOV BUFFER[SI],AX 因为内存之间不能交换,所以必须通过AX作为过渡。

  45. 计算机运算: 二进制数 人阅读: 十进制数、字符等 计算机通信 (外设) ASCII码 四、码转换程序设计 1、二进制数转换为ASCII码

  46. 例:把二进制数码串中每一字节的两位十六进制数转换为ASCII码。高位在高地址,低位在低地址。例:把二进制数码串中每一字节的两位十六进制数转换为ASCII码。高位在高地址,低位在低地址。 BUFFER STRING 34 A4 41 2C 43 53 32 3B 33 35 42 33

  47. 16进制数首地址→BX ASCII码首地址→SI 16进制数长度→CX CHANGE子程序框图 Y (AL)<10 ASCII码长度→L2 N (AL)+07H→AL AGAIN 取待转换数→AL→DL ADD_0 (AL)+30H→AL 分离出低4位 (AL)→(SI) (SI)+1→SI 调用CHANGE子程序 分离出高4位右移四位 RET 调用CHANGE子程序 N (CX)-1=0 Y 结 束 主程序 输入参数:1、待转换的二进制数AL 2、存放ASCII码的地址指针 输出参数:1、转换的ASCII码放入SI间址 的内存 2、修改后的SI指针

  48. P146例3-13 NAME HEX_CHANGE_ASCII DATA SEGMANT L1 DW 2 ; 设置2个字节的16进制数 STRING DB 34H,98H L2 DW ? ;设置1 字节为ASCII码长度 BUFFER DB 2*2 DUP (?) ;设置4字节存放空间 DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA ES:DATA

  49. START PROC FAR BEGIN: PUSH DS MOV AX,0 PUSH AX ;DOS的DATA段保护 MOV AX,DATA MOV DS,AX ;置本程序的DS MOV ES,AX ;置本程序的ES MOV CX,L1 LEA BX,STRING ;置源操作数指针 LEA SI,BUFFER ;置目的操作数指针 MOV AX,CX SAL CX,1 ; 完成L2的运算 MOV L2,CX MOV CX,AX

  50. AGAIN: MOV AL,[BX];取源操作数,存入AL DL MOV DL,AL AND AL,0FH; 使高4为0,底4位保留 CALL CHANGE; 调子转换为ASCII存入内存 MOV AL,DL; 恢复原操作数 PUSH CX; 因移位使用CL原CX入栈保护 MOV CL,4; 原高4位到低4 SHR AL,CL; 高4位为0 POP CX; 原CX恢复 CALL CHANGE; 调子转换为ASCII存入内存 INC BX; 修改源操作数指针 LOOP AGAIN, 判循环终点 RET START ENDP

More Related