您现在的位置: 捷凌网安 >> 编程语言 >> 汇编编程 >> 正文
Casl汇编语言辅导(2)

作者:佚名 责任编辑:左决 点击数: 更新时间:2008-2-16 5:56:26

三、试题解释

1、2001年试题三

[程序说明]

子程序 DEHZ 用来对 HZ 编码的字串做解码处理。

HZ 编码是海外华人创造的一种将含有高位为 1 的汉字双字节字串转换成易于在网络中传输的ASCII 字符串的变换方式。编码过程中,被转换字符串中的原汉字子字符串各字节高位作清零处理,使之成为 ASCII 子字符串,并在其前后两端分别添加 ~{ 和 ~} 作为标记;而对于原 ASCII 子字符串,则将其中的 ~ 改写为 ~~,其余字符不变。

DEHZ 解码子程序则是 HZ 编码的复原过程。复原 ASCII 子字符串过程中遇有 ~~ 字符则改写为一个 ~ ,遇有 ~{ 则将其后直至 ~} 标记前的各字节高位置 1,复原为汉字子字符串,同时删除其前后标记。~的后续字符不属于以上情况均作为错误处理。

调用该子程序时, GR1 存放原始字符串首地址, GR2 存放还原后的目标字符串首地址。工作寄存器  GR3 用作处理汉字子字符串的识别标志,进入子程序时应初始化为处理 ASCII 子字符串。程序按照   CASL 语言的标准约定,字符串的每个字符只占用一个存储字的低八位。原始字符串和目标字符串均以 0 作为结束标志。

[程序]

START 1
DEHZ PUSH 0,GR3 2
PUSH 0,GR2 3
PUSH 0,GR1 4
LEA GR3,0 5
LOOP __(1)__ 6
CPA  GR0,MARK0 7
JNZ GOON 8
LEA GR1,1,GR1 9
LD GR0,0,GR1 10
CPA GR0,MARK0 11
__(2)__ 12
CPA GR0,MARK1,GR3 13
JNZ  ERROR 14
__(3)__ 15
LEA GR1,1,GR1 16
JMP LOOP 17
ERROR OUT ERS1R,ERLEN 18
JMP EXIT 19
GOON __(4)__ 20
ST GR0,0,GR2 21
LEA GR2,1,GR2 22
LEA GR1,1,GR1 23
CPA GR0,VO 24
__(5)__ 25
EXIT P0P GR1 26
P0P GR2 27
P0P GR3 28
RET 29
V1 DC 1 30
V0  DC O 31
DC #0080 32
MARK0 DC  '~ ' 33
MARK1 DC '{ }' 34
ERSTR DC 'ERROR!' 35
ERLEN DC 6 36
END 37

[解]
寄存器作用:
GR1:源字符串地址指针,调用该子程序时,存放源字符串首地址。
GR2:目标字符串地址指针,调用该子程序时,存放目标字符串首地址。
GR3:用作处理汉字子字符串的识别标志。0 表示 ASCII 码(初始值),1 表示汉字。
GR0:工作寄存器,存放待处理的字符。(从第 7 行 "CPA  GR0,MARK0" 看出)
分析:
1)从第 7 行 " CPA  GR0,MARK0" 看出,GR0 中存放待处理的字符。所以第 6 行(__(1)__)必定是一条取数指令:"LD  GR0,0,GR1" ,即把源字符串地址指针所指的字符取到 GR0 中。
2)从第7 行及第 8 行可知,第 9 行到第 17 行是处理碰到“~”的情况,即判断后一字符是否是“~”、“{ ”及“}”。若都不是,则出错。
3)从第11 行可知,要判断是否连续两个“~”情况,而后面是继续比较,所以第 12 行(__(2)__)应该是一条“JZE”指令,而且是转移到 GOON ,即把“~”存放到目标字符串中。
4)第 13 行“CPA GR0,MARK1,GR3”应该是比较“{ ”及“}”:在中文状态比较“}”(结束),在西文状态比较“{ ”(开始)。所以这里用的是变址寻址,即由 GR3 的值是 0 或 1,决定是比较“{ ”还是“}”。
5)第 12 行(__(3)__)应该是改变汉字子字符串的识别标志 GR3 的指令,即原来是 0 的变成 1,原来是 1 的变成 0,异或指令可以达到此目的。将 GR3 与常数 1 相异或,因 Casl 没有没有立即数运算指令,只能和常数 V1 异或:EOR GR3,V1
6)第 20 行(__(4)__)是 GR0 中存放的字符送到目标字符串前的处理工作:若是西文状态( GR3 的值是 0 ),保持原样;若是中文状态( GR3 的值是 1 ),字节最高位置 1,复原为汉字子字符串,将GR0 的内容与十六进制数 0080 相或,即能达到目的。所以这条指令应是:OR GR0,V0,GR3 。
7)第 24 行将 GR0 与 0 比较,是判断字符串结束标志 0 。若非 0(未结束),继续处理。故第 25 行(__(5)__)应是一条条件转移指令:JNZ LOOP 。

[1] [2] [3] [4] 下一页

  • 上一篇文章:

  • 下一篇文章:
  •  
    最进更新
    普通文章VC++设计超强仿QQ自动伸缩窗04-17
    推荐文章基于HOOK和MMF的Win密码渗透04-17
    推荐文章几种VC++数据库开发技术的相04-17
    普通文章多线程、Socket技术及委托技04-11
    推荐文章VB.Net连接各种数据库的几种04-11
    普通文章VB.NET中的多窗体编程:升级04-11
    普通文章用VB.NET定制Windows控件04-11
    普通文章VB.NET中监视文件夹的变化04-11
    普通文章VB.NET中对象的克隆04-11
    推荐文章VB.NET中的TextBox控件详解04-11
     
    推荐文章
    推荐文章基于HOOK和MMF的Win密码渗透04-17
    推荐文章几种VC++数据库开发技术的相04-17
    推荐文章VB.Net连接各种数据库的几种04-11
    推荐文章VB.NET中的TextBox控件详解04-11
    推荐文章在VB.NET中进行抓屏04-11
    推荐文章VB.Net开发的长内容自动分页04-11
    推荐文章VB.NET中快速访问注册表技巧04-11
    推荐文章PHP5手动最简安装方法03-07
    推荐文章完全讲解PHP+MySQL的分页显示03-07
    推荐文章Linux Shell元字符知识笔记02-21
     
    热点文章 
    普通文章VC++设计超强仿QQ自动伸缩窗04-17
    推荐文章基于HOOK和MMF的Win密码渗透04-17
    推荐文章几种VC++数据库开发技术的相04-17
    普通文章VB.NET中的多窗体编程:升级04-11
    普通文章用VB.NET定制Windows控件04-11
    普通文章VB.NET中对象的克隆04-11
    推荐文章VB.NET中的TextBox控件详解04-11
    普通文章VB/VB.NET/C#导出到Excel的方04-11
    普通文章如何通过VB.NET获取网卡地址04-11
    普通文章VB.NET中使用ListView控件的04-11

    | 设为首页 | 加入收藏 | 联系站长 | 广告服务 | 友情链接 | 版权申明 | 网站地图 |

    在线交流 捷凌网安主群:51649627
    Copyright 2007-2008 © 捷凌网安. All rights reserved.
    备案序号:蜀ICP备08001812号