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)