【问题标题】:How to compare a '/0' character without it converting to '0'如何比较“/ 0”字符而不将其转换为“0”
【发布时间】:2019-09-23 05:21:05
【问题描述】:

我的计算机体系结构课上有一个作业,基本上是用 ASM(32 位)编写代码,从给定字符串中删除特定字符并给我新的长度(不包括 '/0')

  • 示例:“你好\n\0”
  • 要删除的字符:'l'
  • 结果:“Heo\n\0”
  • 长度:4

我可以从字符串中删除任何字符,但是,作为测试程序是否可以在任何情况下运行的测试,我有一个条件来检查要删除的字符是否为 /0,并且每次我这样做时比较失败,因为它将“/ 0”转换为“0”。 我在网上读到,当你写 '/' 时,它等于写 (char),它返回 in char 形式。

  • 示例:(char)1 = '1'

有什么方法可以比较字符'/0'而不进行转换?我也无法更改数据部分,因为它是作业规则的一部分,只能在 '' 和 "" 之间更改。

下面我展示我的代码

我的变量被称为 remove 并且它是这样声明的:

  • 删除:.byte '/0'

然后我会这样做:

mov remove, %cl
cmp $0, %cl
jz goToEnd

如果零标志设置为 0,那么我将结束我的函数,但绝不会出现这种情况,因为 %cl 接收到对应于 '0' 的十进制 48 值。

【问题讨论】:

    标签: assembly char type-conversion integer


    【解决方案1】:

    你在几个地方有/0。正斜杠并不特殊'/0' 是 asm 中的 2 字节常量。

    如果您的意思是整数值 0 的字节,请确保您写入 '\0',它是隐式长度 C 字符串的终止符。

    (所以不,你不能从字符串的末尾删除它;它字符串的末尾。除非你有明确长度的字符串,在这种情况下你删除最后一个字节长度减 1)

    反斜杠是 C 中的转义序列,在 GAS 字符串中也是如此,因此您可以写成 '\n' 而不是整数 10https://en.wikipedia.org/wiki/Escape_sequences_in_C

    不过,通常在 GAS 语法中,您可以通过使用 .asciz.string 指令来获得字符串的零终止符。

    【讨论】:

    • 是的,我在我的代码中写了 '\0',但由于某种原因,我在这里写了 '/0',抱歉。当我将该 remove 变量与 $0 进行比较时,它返回 false 因为 null 不同于 $0乙>。谢谢你的澄清,那一定还有其他的测试让我试试。
    • @TiagoMorais:使用 GDB 检查内存中的实际内容。我不确定'\0' 是如何与 GAS 组装的。当然,如果您直接与内存进行比较,请确保您使用的是cmpb 而不是cmpl 或其他东西(首先不加载到像%cl 这样的字节寄存器中。0 终止符字节的整数值为零,并且cmp $0, %cltest %cl,%cl 应该设置 ZF,因为它们是相等的。test %cl,%cl / jnz 是您在简单的 strlen 中用作循环条件的内容,它一次搜索 1 个字节的终止符。
    猜你喜欢
    • 2020-02-23
    • 1970-01-01
    • 1970-01-01
    • 2013-01-21
    • 2011-12-03
    • 1970-01-01
    • 1970-01-01
    • 2020-02-13
    • 2017-05-12
    相关资源
    最近更新 更多