Assembly x86汇编ATT/GNU语法打印字符串子例程
我试图创建一个子例程,允许用户加载带有ASCII缓冲区的寄存器,并通过调用子例程将其打印到屏幕上 我猜递增的while循环Assembly x86汇编ATT/GNU语法打印字符串子例程,assembly,x86,32-bit,inline-assembly,Assembly,X86,32 Bit,Inline Assembly,我试图创建一个子例程,允许用户加载带有ASCII缓冲区的寄存器,并通过调用子例程将其打印到屏幕上 我猜递增的while循环%edi(计数器)没有看到终止字符 我还想知道我是否使用了正确的寻址模式(我对while循环使用register-indirect) 这是我的包含文件: PrintString: push %ebp : cmp $0, (%ebx,%edi) #i am trying to do a
%edi
(计数器)没有看到终止字符
我还想知道我是否使用了正确的寻址模式(我对while循环使用register-indirect)
这是我的包含文件:
PrintString:
push %ebp
:
cmp $0, (%ebx,%edi) #i am trying to do a while loop that increments edi until
#it encounters the null terminator "\0"
je Print
add $1, %edi
jmp StringNotEmpty
正如您所注意到的,问题在于检查NUL终止符:
cmp $0, (%edx,%edi)
在32位上,默认操作数大小为32位字,因此需要以4×\0
结束字符串,以使其停止(或者幸运的是,在字符串后遇到零填充的垃圾)
在这种情况下,您只需要加载和检查一个8位字符,因此需要使用b
后缀,如下所示:
cmpb $0, (%edx,%edi)
您可以看到所有不同的后缀。我认为\0不是有效的空终止符。这或你的cmp是错误的。是的,是cmp。我应该用cmpb。谢谢你的意见。它现在运行得很好。非常感谢你!我还在学习,我知道MOV的不同后缀,但我没有将它们连接到所有操作码,而不仅仅是MOV。再次感谢!
cmpb $0, (%edx,%edi)