首页 考试吧论坛 Exam8视线 考试商城 网络课程 面授课程 模拟考试 实用文档 缤纷校园 英语学习
2010考研 | 自学考试 | 成人高考 | 专 升 本 | 法律硕士 | MBA/MPA | 中 科 院
四六级 | 商务英语 | 公共英语 | 职称日语 | 职称英语 | 博思 | 口译笔译 | GRE GMAT | 日语 | 托福
雅思 | 专四专八 | 新概念 | 自考英语 | 零起点英韩语 | 在职申硕英语
在职攻硕英语 | 成人英语三级
等级考试 | 水平考试 | 微软认证 | 思科认证 | Oracle认证 | Linux认证
公务员 | 报关员 | 报检员 | 外销员 | 司法考试 | 导游考试 | 教师资格 | 国际商务师 | 跟单员
单证员 | 物流师 | 价格鉴证师 | 银行从业资格 | 证券从业资格 | 人力资源管理师 | 管理咨询师
期货从业资格 | 社会工作者
会计职称 | 注会CPA | 经济师 | 统计师 | 注册税务师 | 评估师 | 精算师 | 高会 | ACCA | 审计师
法律顾问 | 会计证
建造师一级二级) | 造价师 | 监理师 | 安全师 | 咨询师 | 结构师 | 建筑师 | 安全评价师
估价师房地产估价土地估价) | 设备监理师 | 岩土工程师 | 质量资格 | 房地产经纪人 | 造价员
投资项目管理 | 土地代理人 | 环保师 | 环境影响评价 | 物业管理师 | 城市规划师 | 公路监理师
公路造价工程师 | 招标师
执业护士 | 执业医师 | 执业药师 | 卫生资格
 萧雨 
您现在的位置: 考试吧(Exam8.com) > 软件水平考试 > 复习资料 > 正文

Casl汇编语言辅导(二)

二、汇编语言常用子程序
1、拆字与拼字: 
【例1】将 GR0 中的四位 BCD 码从高到低依次存放到 GR2 所指的四个内存单元中。
START
LEAGR3,4;循环计数器
L1STGR0,REG;保护其余几位 BCD 码
ANDGR0,C000F;屏蔽高 3 位,留下最低 1 位 BCD 码
STGR0,3,GR2;将此位 BCD 码存放到 GR2 所指第四个内存单元
LDGR0,REG;恢复其余几位 BCD 码
SRLGR0,4;将已处理过的此位 BCD 码移出
LEAGR2.-1,GR2;地址指针减 1
LEAGR3,-1,GR3;循环计数器减 1
JNZL1;未处理完,继续
RET
C000FDC#000F ;十六进制常数,屏蔽屏蔽高 3 位 BCD 码用
REGDS1 ;暂存单元 
END

 
【例2】将存放在 GR2 所指的四个内存单元中的四位 BCD 码依从高到低顺序压缩到 GR0 中 。
START
LEAGR0,0;GR0 清 0
LEAGR3,4;循环计数器
L1SLLGR0,4;将已处理过的 BCD 码移到高位
LDGR1,0,GR2;GR1 用作临时工作寄存器
ANDGR1,C000F;屏蔽高 12 位
STGR1,0,GR2;对内存单元中的 BCD 码预处理
ADDGR0,0,GR2;将已处理过的此位 BCD 码加到 GR0 低位
LEAGR2.1,GR2;地址指针指向下一位 BCD 码
LEAGR3,-1,GR3;循环计数器减 1
JNZL1;未处理完,继续
RET
C000FDC#000F ;十六进制常数,屏蔽高 12 位二进制数
END

2、数字与 ASCII 码之间的相互转换: 
十进制数字 0~9 的 ASCII 码是 30H~39H ,所以只要将十进制数(BCD 码)加 30H 就是对应的 ASCII 码。
十六进制数转换成 ASCII 码可分成两段, 0~9 的 ASCII 码是 30H~39H ,即加 30H ;A~F 的ASCII 码是 41H~45H ,即加 37 H。
【例1】将 GR0 中的四位 BCD 码化成 ASCII 码从高到低依次存放到字符串变量 STR 中。
START
LEAGR2,3;相对于 STR 首址的地址指针
LEAGR3,4;循环计数器
L1STGR0,REG;保护其余几位 BCD 码
ANDGR0,C000F;屏蔽高 3 位,留下最低 1 位 BCD 码
ADDGR0,C30;转换成 ASCII 码
STGR0,STR,GR2;将 ASCII 码存放到 GR2 所指第四个内存单元
LDGR0,REG;恢复其余几位 BCD 码
SRLGR0,4;将已处理过的此位 BCD 码移出
LEAGR2.-1,GR2;地址指针减 1
LEAGR3,-1,GR3;循环计数器减 1
JNZL1;未处理完,继续
RET
C000FDC#000F ;十六进制常数,屏蔽高 3 位 BCD 码用
C30DC#30 ;十六进制常数 30 
STRDS4 
REGDS1 ;暂存单元 
END

 
【例2】将 GR0 中的 16 位二进制数化成四位十六进制数 ASCII 码从高到低依次存放到字符串变量 STR 中。
START
LEAGR2,3;相对于 STR 首址的地址指针
LEAGR3,4;循环计数器
L1STGR0,REG;保护其余几位二进制数
ANDGR0,C000F;屏蔽高 12 位,留下最低 4 位二进制数
CPLGR0,C0A;< 10 否?
JMIL2;< 10 跳过加 7 ,只加 30H
ADDGR0,C7;≥ 10,加 30H 前先加上 7
L2 ADDGR0,C30;加上 30H
STGR0,STR,GR2;将 ASCII 码存放到 GR2 所指第四个内存单元
LDGR0,REG;恢复其余几位二进制数
SRLGR0,4;将已处理过的此 4 位二进制数移出
LEAGR2.-1,GR2;地址指针减 1
LEAGR3,-1,GR3;循环计数器减 1
JNZL1;未处理完,继续
RET
C000FDC#000F ;十六进制常数,屏蔽屏蔽高 12 位二进制数
C30DC#30 ;十六进制常数 30 
C0ADC#0A ;十六进制常数 0A 
C7DC7 ;常数 7 
STRDS4 
REGDS1 ;暂存单元 
END

 
【例3】将字符串 STR 中的四位十六进制数的 ASCII 码化成 16 位二进制数放到 GR0 中 。
START
LEAGR0,0;GR0 清 0
LEAGR2,0;相对于 STR 首址的地址指针
LEAGR3,4;循环计数器
L1SLLGR0,4;将已处理过的十六进制数移到高位
LDGR1,STR,GR2;GR1 用作临时工作寄存器
ANDGR1,C00FF;屏蔽高 8 位
SUBGR0,C30;减去30H
CPLGR0,C0A;< 10 否?
JMIL2;< 10 ,完成转换
SUBGR0,C7;≥ 10,再减去 7
L2 STGR1,STR,GR2;将 STR 中的 ASCII 码转换成十六进制数
ADDGR0,STR,GR2;将此位十六进制数加到 GR0 低位
LEAGR2.1,GR2;地址指针指向下一位 ASCII 码
LEAGR3,-1,GR3;循环计数器减 1
JNZL1;未处理完,继续
RET
C00FFDC#00FF ;十六进制常数,屏蔽高 8 位用
C30DC#30 ;十六进制常数 30 
C0ADC#0A ;十六进制常数 0A 
C7DC7 ;常数 7 
STRDS4 
END

3、利用加减法及移位指令做乘法: 
1)左移指令可将操作数乘 2 的整数次方(2、4、8、16);右移指令可将操作数除以 2 的整数次方。 
若操作数是无符号数,用逻辑移位指令;若操作数是有符号数,用算术移位指令。 
【例1】将 GR0 中的二进制数乘以 8。
SLLGR0,3

【例2】将 GR0 中的带符号二进制数除以 4。
SRAGR0,2

2)将移位指令和加减法结合起来可完成乘数不是 2 的整数次方的乘法运算。 
【例1】将 GR0 中的二进制数乘以 10。
START
SLLGR0,1
STGR0,REG
SLLGR0,2
ADDGR0,REG
RET
REGDS1
END

【例2】将 GR0 中的二进制数乘以 7。
START
STGR0,REG
SLLGR0,3
SUBGR0,REG
RET
REGDS1
END

4、二进制数与十进制数的转换 
1)二化十:
将二进制数转换为十进制数的一种常用算法是将被转换的二进制数依次被 10i( 对 16 位二进制数,i为 4、3、2、1、0)除,所得的商即为该十进制数位的值,其余数再被下一个 10i 除。一般用减法代替除法,即一边减 10i,一边计数器加 1,直到不够减再进行下一位 10i-1。以求得十进制数的各位数。
例如:一个相当于十进制数 34635 的二进制数,可先用 10000 去减,可减 3 次,得万位数是 3;再用 1000 去减,得千位数是 4;……
【例1】将 GR0 中的二进制数转换为十进制数的ASCII 码放入字符串 STR 中。
START
LEAGR1,0;减数表及字符串指针 
LEAGR2,5;循环计数器 
L1 LEAGR3,48;该十进制位的数码预置 0 的 ASCII 码
L2LEAGR3,1,GR3;数码位的 ASCII 码加 1
SUBGR0,SNO,GR1;操作数减去 10i  
JPZL2;够减,继续 
ADDGR0,SNO,GR1;不够减,操作数及数码位的 ASCII 码恢复 
LEAGR3,-1,GR3
STGR3,STR,GR1;转换好的该位 ASCII 码存入结果字符串 
LEAGR1,1,GR1;地址指针加 1 
LEAGR2,-1,GR2;循环计数器减 1 
JNZL1;未结束,继续下一位 
RET
SNODC10000
DC1000
DC100
DC10
DC1
STRDS5 ;转换结果字符串
END

1)十化二:
将十进制数转换为二进制数的算法基础是下面公式:
N = (Dn-1*10n-1+Dn-2*10n-2+……+D1*101+D0*100
  = ((…((Dn-1*10+Dn-2)*10+……+D1)*10+D0)*10
可以用循环程序实现此公式,*10 可用移位及加法指令完成。
【例2】将存放在字符串 STR 中的五位十进制数(<65536)的 ASCII 码转换成二进制数放到 GR0 中 。
START
LEAGR0,0;转换结果寄存器清 0 
LEAGR2,5;循环计数器 
LEAGR1,0;地址指针(偏移量)
L1 SLLGR0,1;转换结果*10,先乘以 2
STGR0,REG;暂存 2*X
SLLGR0,2;2*X*4=8*X
ADDGR0,REG;8*X + 2*X
LDGR3,STR,GR1;取一位 ASCII 码
ANDGR3,C000F;将 ASCII 码变成 BCD 码
STGR3,REG;结果暂存 
ADDGR0,REG;将新的一位 BCD 码加到转换结果中 
LEAGR1,1,GR1;地址指针加 1 
LEAGR2,-1,GR2;循环计数器减 1 
JNZL1;未结束,继续下一位 
RET
C000FDC#000F ;十六进制常数,屏蔽高 12 位二进制数
STRDC’35475’ 
REGDS1;暂存单元 
END

5、求累加和 
【例1】将变量 NUMBER 中的 5 个二进制数累加后放入变量 SUM 中。
START
LEAGR2,NUMBER;地址指针
LEAGR3,5;循环计数器
LEAGR0,0;累加和清 0
L1ADDGR0,0,GR2;累加
LEAGR2,1,GR2;地址指针指向下一个二进制数
LEAGR3,-1,GR3;计数器减 1
JNZL1;未完,继续
STGR0,SUM;累加结束,累加和送入 SUM 单元
RET
NUMBERDS5
SUMDS1
END 转帖于:软件水平考试_考试吧
文章搜索
Casl汇编语言辅导(二)网友评论网友评论
版权声明 --------------------------------------------------------------------------------------
    如果软件水平考试网所转载内容不慎侵犯了您的权益,请与我们联系,我们将会及时处理。如转载本软件水平考试网内容,请注明出处。