ssd*_*ssd 5 c x86 assembly masm visual-studio
我是Assembly的新手,下面的代码应该通过两个不同的函数交换两个整数:首先使用swap_c然后再使用swap_asm.
但是,我怀疑,我是否需要push(我的意思是保存)汇编代码之前的每个寄存器值以及pop它们之后(就在返回之前main).换句话说,如果我在运行函数后返回不同的寄存器内容(不是像ebp或者esp只是eax,但是,只是ebx,ecx&edx),CPU会不会生我的气swap_asm?取消组装部件中的线条是否更好?
这段代码对我来说运行正常,我设法将27行汇编C代码减少到7个装配线.
ps:系统是Windows 10,VS-2013 Express.
main.c 部分
#include <stdio.h>
extern void swap_asm(int *x, int *y);
void swap_c(int *a, int *b) {
int t = *a;
*a = *b;
*b = t;
}
int main(int argc, char *argv[]) {
int x = 3, y = 5;
printf("before swap => x = %d y = %d\n\n", x, y);
swap_c(&x, &y);
printf("after swap_c => x = %d y = %d\n\n", x, y);
swap_asm(&x, &y);
printf("after swap_asm => x = %d y = %d\n\n", x, y);
getchar();
return (0);
}
Run Code Online (Sandbox Code Playgroud)
assembly.asm 部分
.686
.model flat, c
.stack 100h
.data
.code
swap_asm proc
; push eax
; push ebx
; push ecx
; push edx
mov eax, [esp] + 4 ; get address of "x" stored in stack into eax
mov ebx, [esp] + 8 ; get address of "y" stored in stack into ebx
mov ecx, [eax] ; get value of "x" from address stored in [eax] into ecx
mov edx, [ebx] ; get value of "y" from address stored in [ebx] into edx
mov [eax], edx ; store value in edx into address stored in [eax]
mov [ebx], ecx ; store value in ecx into address stored in [ebx]
; pop edx
; pop ecx
; pop ebx
; pop eax
ret
swap_asm endp
end
Run Code Online (Sandbox Code Playgroud)
通常,这取决于您正在使用的系统的调用约定.该调用约定指定如何调用函数.通常,它会说明放置参数的位置以及被调用函数必须保留哪些寄存器.
与cdecl调用约定的i386的Windows(这是你可能使用的),可以随意改写eax,ecx和edx寄存器.该ebx寄存器必须被保留.虽然您的代码似乎有效,但当函数开始依赖于ebx被保留时,它会神秘地失败,因此最好保存并恢复它.
| 归档时间: |
|
| 查看次数: |
177 次 |
| 最近记录: |