Assembly 如何在不创建新函数的情况下反转程序集中的堆栈
我现在面临的问题是逆转我的堆栈 我能够改变我想要的符号,但我一直在改变我的堆栈 这是我目前的代码:Assembly 如何在不创建新函数的情况下反转程序集中的堆栈,assembly,stack,x86-64,nasm,Assembly,Stack,X86 64,Nasm,我现在面临的问题是逆转我的堆栈 我能够改变我想要的符号,但我一直在改变我的堆栈 这是我目前的代码: section .text global do_Str extern printf do_Str: push rbp mov rbp, rsp mov rcx, rdi mov rbx, rdi mov rdx, rcx mov r10, 0 mov r9, 0 label:
section .text
global do_Str
extern printf
do_Str:
push rbp
mov rbp, rsp
mov rcx, rdi
mov rbx, rdi
mov rdx, rcx
mov r10, 0
mov r9, 0
label:
cmp byte[rcx], 'a'
jl cont
cmp byte[rcx], 'z'
jg cont
and byte [rcx], 11011111b
cont:
cmp byte[rcx], '('
jne contP
mov byte[rcx], '<'
contP:
cmp byte[rcx], ')'
jne contR
mov byte[rcx], '>'
contR:
cmp byte[rcx],'A'
jl contL
cmp byte[rcx], 'Z'
jg contL
inc r9
contL:
_push_loop:
mov al,[rdx]
cmp al, 0
jz _pop_loop
push ax
inc rdx
jmp _push_loop
_pop_loop:
mov al,[rbx]
cmp al,0
jz _done
pop ax
mov [rdx], al
inc rbx
jmp _push_loop
_done:
inc r10
inc rcx
cmp byte [rcx], 0
jnz label
sub r10, r9
mov rax, r10
mov rsp, rbp
pop rbp
ret
我不允许在我的C文件中创建新函数
这是我的C代码:
#包括
#定义最大长度100
外部内部数据(字符*);
内部主(空){
char str_Buf[MAX_LEN];
int计数器=0;
fgets(str_Buf、MAX_LEN、stdin);
计数器=do_Str(Str_Buf);
printf(“%s%d\n”,str\u Buf,计数器);
返回0;
}
我在堆栈溢出上搜索了它,但没有找到问题的解决方案
全部作业是:1。将输入中的小写字母更改为大写字母
2.数一数有多少字符不是字母
3.反转输入-我被困在这里,我想我没有完全了解堆栈的流程。你的意思是反转字符串而不是堆栈吗?您只需将最后一个字符与第一个字符交换,然后继续中间的操作。@Jester我从用户那里得到一个输入-一个字符串,正如您所看到的,我将它推到堆栈中。我不知道如何更改位置,如果你能帮我弄明白这会有帮助。
mov rbx,rdi
-如果不先保存它,调用方可以假设rbx在调用你的函数后没有修改,就像RBP一样。你有足够的其他寄存器;您可以避免使用RBX和其他保留呼叫的寄存器。事实上,你甚至没有使用RDI,只是修改它而不是RBX。我已经更新了这个问题。
Segmentation fault (core dumped)