String 反转字符串并在IA32程序集中打印

String 反转字符串并在IA32程序集中打印,string,assembly,x86,att,reversing,String,Assembly,X86,Att,Reversing,因此,基本上我要读取一个字符串,增加一个计数器(在本例中为%edx),直到我读取一个\n,然后反向打印它 这是我的代码: .section .data cadsal: .asciz "Por favor ingrese su cadena:\n" leer: .asciz "%s" salidafinal: .asciz "La cadena introducida, invertida es:\n" imp: .asciz "%c\n" .第节.bss

因此,基本上我要读取一个字符串,增加一个计数器(在本例中为%edx),直到我读取一个\n,然后反向打印它

这是我的代码:

.section .data
cadsal: 
    .asciz "Por favor ingrese su cadena:\n"

leer:
    .asciz "%s"

salidafinal:
    .asciz "La cadena introducida, invertida es:\n"

imp:
    .asciz "%c\n"
.第节.bss 卡德纳通讯社,50,1

.第节.正文

.globl_启动

_开始:

leal cadsal, %eax
pushl %eax
call printf
addl $4, %esp

leal cadena, %eax
pushl %eax
leal leer, %eax
pushl %eax  
call scanf
addl $8, %esp

xorl %edx, %edx
续:

movb cadena(%edx), %al
incl %edx
cmpb $0, %al
jne Contar

leal salidafinal, %ecx
pushl %ecx
call printf
addl $4, %esp

addl $-2, %edx
逆变器:

movb cadena(%edx), %al
pushl %eax
leal imp, %ebx
pushl %ebx
call printf
addl $8, %esp

decl %edx
cmpl $0, %edx
jge Invertir

movl $1, %eax
int $0x80
我在编译时使用命令-nostartfiles。它可以工作,但当我运行它时,进入“Invertir”时会出现分段错误。我需要帮助来检测代码中的错误


谢谢

您当前的问题是
cmpb'\n',%al
,它缺少at&t语法中使其立即生效所需的
$
符号。实际上,
'\n'
被认为是一个地址,并且是一个无效的地址。您应该使用
cmpb$'\n',%al

但是
scanf
根本不会将
'\n'
放入缓冲区,因为
%s
在空白处停止。因此,您确实希望寻找一个终止的零字节,即使用
cmpb$0,%al
。或者,如果您确实需要阅读整行文字,请使用
fgets

如果您解决了这个问题,您将遇到下一个问题,即您的
cmp
jne
之间有一个
incl%edx
,它将更改标志,因此您将不会根据比较结果进行分支,而是增量。解决方案:交换
cmp
incl

另一个问题是一些寄存器,包括
%edx
,被保存。因此,它们可以被调用的函数修改,您可以调用printf。您应该
/
弹出
推到这两个位置以保留值

即使在所有这些之后,由于缓冲,在手动打印最终的
\n
之前,您可能不会看到任何输出

请注意,如果您打算使用C库,就不应该使用
-nostartfiles
。相反,您应该使用入口点
main
并正常组装和链接。另外,您只需从
main
(或至多
callexit
)返回,而不使用直接系统调用,因为这不允许C库正确清理。顺便说一句,这也会刷新I/O缓冲区,因此即使没有额外的换行符,您也会看到输出


你应该真正学会使用调试器。

嘿!谢谢你的回答。对不起,我还是个装配爱好者。你的确切意思是什么:你应该推动/弹出这两个来保持价值。我应该推什么?
printf
业务(包括参数设置)之前推%edx
,在
add esp
之后推%edx。交换了第一个cmp和incl,“Contar”现在似乎工作正常。我现在在“Invertir”中遇到了分段错误。修改了addl$-2,%edx,因为contar结束时%edx是从$0(字符串末尾)向前一步。无需担心。学习了一点如何使用调试器。更改了我代码中的一些内容。那玩意儿救了我的命。非常感谢你。