Assembly 如何比较a'/0';不转换为'的字符;0';

Assembly 如何比较a'/0';不转换为'的字符;0';,assembly,char,type-conversion,integer,Assembly,Char,Type Conversion,Integer,我的计算机体系结构课程有一个家庭作业,基本上是用ASM(32位)编写一个代码,从给定字符串中删除一个特定字符,并给出新的长度(不包括“/0”) 示例:“你好\n\0” 要删除的字符:“l” 结果:“Heo\n\0” 长度:4 我可以从字符串中删除任何字符,但是,为了测试程序是否可以在任何情况下工作,我有一个条件来检查要删除的字符是否为/0,每次我这样做时,它都会在将“/0”转换为“0”时失败比较。 我在网上读到,当你写“/”时,它等于写(char),它以char的形式返回 示例:(char

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

  • 示例:“你好\n\0”
  • 要删除的字符:“l”
  • 结果:“Heo\n\0”
  • 长度:4
我可以从字符串中删除任何字符,但是,为了测试程序是否可以在任何情况下工作,我有一个条件来检查要删除的字符是否为/0,每次我这样做时,它都会在将“/0”转换为“0”时失败比较。 我在网上读到,当你写“/”时,它等于写(char),它以char的形式返回

  • 示例:(char)1='1'
是否有任何方法可以在不转换字符'/0'的情况下对其进行比较?我也不能更改数据部分,因为它是家庭作业规则的一部分,只有介于“”和“”之间的部分

下面我展示我的代码

我的变量名为remove,声明如下:

  • 删除:。字节“/0”
然后我会:

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


如果零标志设置为0,则我将结束我的函数,但情况永远不会如此,因为%cl接收到与“0”相对应的十进制48中的值。

您在几个地方有
/0
。正斜杠并不特别
<代码>“/0”是asm中的一个2字节常量

如果您是指具有整数值的字节,请确保写入
'\0'
,即隐式长度C字符串的终止符

(因此,不能将其从字符串末尾移除;它是字符串的结尾。除非有显式长度字符串,在这种情况下,可以通过将长度减1来移除最后一个字节)

反斜杠在C中是一个转义序列,在气体串中也是如此,因此您可以编写
'\n'
而不是整数
10


但是,通常在GAS语法中,通过使用
.asciz
.string
指令,字符串会有一个零终止符。

是的,我在代码中写了“\0”,但出于某种原因,我在这里写了“/0”,对不起。当我将remove变量与$0进行比较时,它返回false,因为null与$0不同。谢谢你的澄清,那时我肯定还有其他的测试要做。@TiagoMorais:使用GDB检查内存中的实际内容。我不确定
'\0'
如何与GAS组合。当然,如果您直接与内存进行比较,也要确保您使用的是
cmpb
而不是
cmpl
或其他东西(无需先加载到字节寄存器,如
%cl
。0终止符字节的整数值为零,
cmp$0,%cl
test%cl,%cl
应设置ZF,因为它们相等。
test%cl,%cl/jnz
是在搜索该终止符的简单朴素
strlen
中用作循环条件的一次1个字节。