首页 > 解决方案 > 如何在不创建新函数的情况下反转汇编中的堆栈

问题描述

我现在面临的问题是反转我的堆栈。

我能够更改我想要的符号,但我被困在反转我的堆栈上。

到目前为止,这是我的代码:

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

我尝试更改我的寄存器和指针使用,但所有这些都导致了相同的错误:

Segmentation fault (core dumped)

我不允许在我的 C 文件中创建新函数

这是我的 C 代码:

#include <stdio.h>
#define MAX_LEN 100

extern int do_Str (char*);

int main(void){
    char str_Buf[MAX_LEN];
    int counter = 0;

    fgets(str_Buf,MAX_LEN, stdin);

    counter = do_Str (str_Buf);

    printf("%s%d\n",str_Buf,counter);
    
    return 0;
}

我在 Stack Overflow 上搜索过它,但没有找到解决我的问题的方法。

完整的任务是: 1. 将输入的小写字母更改为大写 2. 计算有多少字符不是字母 3. 反转输入 - 我被困在这里,我想我没有完全意识到堆栈的流程。

标签: assemblystackx86-64nasm

解决方案


推荐阅读