我读了一本用C编写下一个程序的书,并将这个函数的调用转换为汇编代码:
int *p; /* pointer to integer */
int foo (int n, int *q) {}
/* function get int and pointer to int, returns int */
/* Now, let's call the function: */
*p = foo (*p, p);它会转换为:
MOV EBX, [P]
PUSH EBX
PUSH DWORD [EBX]
CALL foo
MOV EBX, [P]
MOV [EBX], EAX
ADD ESP, 8我不明白为什么它是正确的,因为我理解它的代码应该是这样的:
MOV EBX, P ;; **CHANGE**
PUSH EBX
PUSH DWORD [EBX]
CALL foo
MOV EBX, P ;; **CHANGE**
MOV [EBX], EAX
ADD ESP, 8因为P是一个指针。如果我们像书中建议的那样做MOV EBX, [P],我们得到的是整数(而不是地址),然后如果我们做PUSH DWORD [EBX],我们得到的是illigal指令。
我哪里错了?
发布于 2012-03-23 23:35:59
P是一个标签,它等同于一个变量(您的指针变量)的地址。[P]将是该地址的值,也就是指针。
但请注意,有些汇编程序的处理方式略有不同。NASM及其衍生工具对方括号之类的要求相当严格。MASM并非如此;有时它会让您几乎将标签视为其自身的一个变量。
发布于 2012-03-23 23:36:44
假设p位于如下所示的函数中:
void foo(){
int *p; /* pointer to integer */
int foo (int n, int *q) {}
/* function get int and pointer to int, returns int */
*p = foo (*p, p);
}在这种情况下,P将是“变量的位置”或装配术语中的“标签”。因为在这种情况下,P通常会被分配到堆栈上,这意味着当你执行*p=10;时,你实际上是在做这样的事情:
mov EBX,[p] ;; get the value of the p variable (a pointer)
mov [EBX],10 ;; dereference the value of p and assign it to 10https://stackoverflow.com/questions/9841999
复制相似问题