Assembly 如何比较a'/0';不转换为'的字符;0';
我的计算机体系结构课程有一个家庭作业,基本上是用ASM(32位)编写一个代码,从给定字符串中删除一个特定字符,并给出新的长度(不包括“/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
- 示例:“你好\n\0”
- 要删除的字符:“l”
- 结果:“Heo\n\0”
- 长度:4
- 示例:(char)1='1'
- 删除:。字节“/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个字节。