String 反转字符串并在IA32程序集中打印
因此,基本上我要读取一个字符串,增加一个计数器(在本例中为%edx),直到我读取一个\n,然后反向打印它 这是我的代码: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
.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(字符串末尾)向前一步。无需担心。学习了一点如何使用调试器。更改了我代码中的一些内容。那玩意儿救了我的命。非常感谢你。