小编Kid*_*dsm的帖子

在堆栈帧创建之前或之后推送寄存器之间有什么区别吗?

假设我有一个名为 func 的函数:

PROC func:
    ;Bla bla
    ret
ENDP func
Run Code Online (Sandbox Code Playgroud)

现在,假设我使用 register axbx例如,为了保存它们的初始值,我将它们推送到函数内部的堆栈中。

现在的问题是:在创建堆栈帧之前推送寄存器之间是否有很大的不同:

PROC func:
    push bp
    push ax
    push bx
    mov bp, sp
    ;Bla bla
    ret
ENDP func
Run Code Online (Sandbox Code Playgroud)

还是之后?

PROC func:
    push bp
    mov bp, sp
    push ax
    push bx
    ;Bla bla
    ret
ENDP func
Run Code Online (Sandbox Code Playgroud)

我应该在我的程序中使用什么?一种方法比另一种更好或更“正确”吗?因为我目前使用第一种方法。

x86 assembly callstack stack-frame

3
推荐指数
1
解决办法
351
查看次数

x86 程序集:即使实现正确,交换函数的输出也不正确

我一直在研究交换函数,或者最终使用 x86 程序集实现冒泡排序。

我的代码还包括一个函数,该函数稍后为另一个函数重构给定数字(从 - 到 +,反之亦然),我在测试交换函数之前调用了该函数

这是到目前为止的代码:

org  100h
jmp main

    numToNeg dw -9
    toSwap1 db 'a'
    toSwap2 db 'b'

    param1 equ 8 
    swap1 equ 12
    swap2 equ 14



main: 

    push offset numToNeg
    call refactor

    mov ax, numToNeg
    call print_num     

    PRINTN 

    PRINTN "Before Swap:"

    mov al, toSwap1
    Call print_al_chr ;This function prints the given char inside al
    mov al, toSwap2
    Call print_al_chr 

    push offset toSwap1
    push offset toSwap2

    call swap

    PRINTN

    PRINTN "After Swap:"

    mov al, toSwap1
    Call print_al_chr …
Run Code Online (Sandbox Code Playgroud)

assembly swap x86-16

2
推荐指数
1
解决办法
107
查看次数

标签 统计

assembly ×2

callstack ×1

stack-frame ×1

swap ×1

x86 ×1

x86-16 ×1