Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly x86汇编ATT/GNU语法打印字符串子例程_Assembly_X86_32 Bit_Inline Assembly - Fatal编程技术网

Assembly x86汇编ATT/GNU语法打印字符串子例程

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

我试图创建一个子例程,允许用户加载带有ASCII缓冲区的寄存器,并通过调用子例程将其打印到屏幕上

我猜递增的while循环
%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)