assembly - CL 比较验证范围不起作用
问题描述
我正在验证一些输入;输入数字应该是从 1 到 255。我尝试下面的代码。输入定义 ;输入 DC CL60' ''
clc input,=c'255'
bh loop1
clc input,=c'1'
bl loop1
J loop2
loop1
上述验证仅适用于 3 位数(从 100 到 255),但不适用于两位数。请你帮助我好吗 :)
解决方案
很大程度上取决于您对“输入”字段的灵活性。例如,如果您需要以相同的方式处理 C'1'、C'1'、C'1'、C'01'、C'01' 和 C'001',那么您需要做一些额外的工作.
一般来说,您有两种选择。您可以将数据“规范化”为三个字符字段(换句话说,将我在上面提到的所有示例设为 C'001'),或者您可以进行一些富有想象力的可变长度比较以适应您的值的大小'重新尝试比较。
如果您更深入地了解 CLC 的工作原理,这对您来说会更有意义。如果您查看程序的汇编程序列表,您将看到您以十六进制编码的 CLC 的目标代码......它将类似于 D5llsaaatbbb,其中:
- “D5”是操作码 - CLC
- “ll”是您正在做的比较的长度
- “s”是第一个操作数基址寄存器
- "aaa" 是第一个操作数位移
- “t”是第二个操作数基址寄存器
- “bbb”是第二个操作数位移
因此,如果您的输入字段确实是 DC CL60' ',并且它存储在寄存器 10 的 100 个字节处,而文字(=C'whatever')是寄存器 12 的 40 个字节,您会看到 D53BA064C028。编写足够多的汇编程序,您将像阅读英文一样阅读这些内容。:)
正如其他张贴者指出的那样,汇编程序将长度默认为第一个操作数的长度,所以马上,你有一个问题,因为你正在做的比较 (clc input,=C'1') 导致汇编器生成一个 60 字节的比较,即使第二个操作数只有一个字节长。如果您想这样做,您需要将其编码为 clc 输入,=CL60'1 ...'。这就是为什么将指令“向后”编码(如在 clc =C'1',input 中)或显式指定长度(如在 clc input(1),=C'1' 中)通常更方便的原因,以便您不要不经意间跑过您要比较的字段的末尾。
您遇到的下一个问题是将比较设置为可变长度。很多时候,您会想弄清楚您有多少位数,然后比较这些位数而不是字段的长度。例如,您可能会查看编码为“1”的数据并决定跳过空白并仅将字段检查为单字节值。对于这类事情,执行 (EX) 指令是您的朋友——它为您提供了一种进行可变长度比较的简单方法。
假设您发现用户输入了一个字节,因此您想要一个单字节 CLC。假设您想要的长度在寄存器中,代码如下所示:
* Assume you have the length in R1
BCTR R1,0 Don't forget lengths are 0-relative (00 = 1 byte, FF=256)
EX R1,MYCLC Do the comparison using the length in R1
J *+10 Skip over the CLC instruction
MYCLC CLC INPUT(0),PATTERN Executed instruction
EX 指令使用第一个操作数更新目标指令,然后执行它。在示例中,EX 使用 R1 中的值来设置 CLC 中的长度,为您提供可变长度比较。注意 0 的长度 - 在这种情况下,目标代码将是 D500,EX“或”将 R1 的低位与 00 相结合,为您提供所需的长度。很简单,对吧?
难题的最后一部分是对您的 INPUT 字段进行一些解析,假设它是一个可以包含空白等内容的自由格式字段。对此的一个常见需求是在较长的字符串中找到初始的非空白字段......在这里,翻译和测试(TRT)是你的朋友。我不会对细节感到厌烦,但它为您提供了一条指令,可以扫描字段以查找任何特定字符 - 例如,非空白或空白。一对 TRT 指令可以帮助您找到任何分隔字符串的开头和结尾,类似于 C 中的 strchr()(如果您是 C 程序员)。做一些减法得到一些长度,你就可以用上面解释的可变长度比较来做你需要的事情了。
随着您编写更多的汇编程序,您将找出使这些任务更容易的所有小技巧。例如,EBCDIC 的一个“特点”是数字的十六进制编码位于刻度的顶部:F0 到 F9。这意味着在许多简单的应用程序中,您实际上不必处理“高于 999”的情况,因为所有 alpha 和典型符号都低于 C'0'......只需检查不少于0 通常对于字符数据就足够了。
无论如何,这里的一些提示应该可以让你继续前进,而且我相信通过更多的研究,你会毫不费力地获得你期望的结果。
推荐阅读
- google-cloud-platform - 无法创建 Google Compute Engine 实例
- c++ - 使用 Boost::Python、cmake 和 windows 编译
- linux - 如何退出 Linux 控制台中的输入
- java - 有可能减少这种情况吗?(或 Java 中的解构赋值)
- ruby - 将纯 GitHub HTML 网站转换为 Jekyll(终端错误)
- java - Twitter4j,尝试从应用程序中验证第二个帐户显示错误消息
- vba - Powerpoint 窗帘“关闭”过渡效果解决方法
- ios - 有没有办法解决 Azure Active Directory 条件客户端访问
- java - Tomcat 8.5 [HTTPUtils] 域名 [http://localhost:8080] 不允许
- sql - 寻找在 SQL 中动态选择列源的更好方法