如何在C中定义的汇编中增加值?



我想把c和汇编代码结合起来。

我有下面的C代码:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
extern void _increment(unsigned short *x);
int main(int argc, char** argv)
{
unsigned short x = 0;
_increment(&x);
printf("%d", x)
return 0;
}

和汇编(32位NASM)代码:

section .text
global _increment
_increment: 
push ebx        
mov bx, word [esp+8]    ;what is stored in bx here? the x address? 
mov ax, [bx]            ;what is stored in ax here? the x value?
;add word [esp+8], 1 -> dosnt work 
pop ebx             
ret
section .data

如果我执行这个,我得到一个分割错误。有人能解释一下寄存器/堆栈中存储了什么吗?也许我可以增加值而不是X的地址?

很明显你理解指针是如何工作的,唯一的错误是指针本身的大小。在几乎所有的cpu上,指针的大小(不是它指向的东西的大小)将等于指令指针寄存器的大小(在非x86架构上通常称为PC,即程序计数器)。这条规则也有例外,但通常它只会匹配硬件的默认寄存器大小。这就是为什么,正如你在评论中提到的,你只加载了一半的指针,因为你使用bx作为你从堆栈加载的目的地。在x86中,不在括号内的寄存器操作数决定了将被读/写到内存中的字节数。这就是为什么当你执行mov bx, word [esp+8]时,即使esp是32位的,bx是16位的,你也不会得到不匹配操作数大小的汇编错误;右操作数是16位内存,而不是32位寄存器。

最新更新