mov [ebx+18],edi
1。将ebx的值拿出来加上18,结果记为X
2。将edi的值复制给内存地址为X的空间
64位程序在调用system函数时,参数的传递方式和32位不一样,32位是通过栈传参,而64位通过edi寄存器传参
C程序
void add ( int , int , int ) ;
main ( )
{
int a = 1 ;
int b = 2 ;
int c = 0 ;
add ( a , b , c ) ;
c++ ;
}
void add ( int a , int b , int c ){
c = a + b ;
}
编译后的汇编程序
assume cs:code
code segment
start:
mov bp , sp
sub sp , 6
mov word ptr [bp-6] , 0001 ; int a
mov word ptr [bp-4] , 0002 ; int b
mov word ptr [bp-2] , 0000 ; int c
push [bp-2]
push [bp-4]
push [bp-6]
call addr
add sp ,6
inc word ptr [bp-2]
addr:
push bp
mov bp , sp ; bp 暂存刚入栈时候的sp,防止后面一些操作会改变sp,从而获取不到要得到的值;还有一种原因是先分配空间,sp就不改变了,只能通过bp来对空间再赋值
mov ax , [bp+4] ; a
add ax , [bp+6] ; b
mov [bp+8] , ax ; c
mov sp , bp ; 恢复入栈 sp
pop bp
ret ; 子程序返回,pop ip
code ends
end start
// 加上了宏汇编开头两句和最后两句什么的,便于编译然后debug