首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Assembler &C-将C代码翻译成汇编语言

Assembler &C-将C代码翻译成汇编语言
EN

Stack Overflow用户
提问于 2012-03-23 23:30:56
回答 2查看 255关注 0票数 1

我读了一本用C编写下一个程序的书,并将这个函数的调用转换为汇编代码:

代码语言:javascript
复制
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);

它会转换为:

代码语言:javascript
复制
MOV EBX, [P]
PUSH EBX
PUSH DWORD [EBX]
CALL foo
MOV EBX, [P]
MOV [EBX], EAX
ADD ESP, 8

我不明白为什么它是正确的,因为我理解它的代码应该是这样的:

代码语言:javascript
复制
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指令。

我哪里错了?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-03-23 23:35:59

P是一个标签,它等同于一个变量(您的指针变量)的地址。[P]将是该地址的值,也就是指针。

但请注意,有些汇编程序的处理方式略有不同。NASM及其衍生工具对方括号之类的要求相当严格。MASM并非如此;有时它会让您几乎将标签视为其自身的一个变量。

票数 3
EN

Stack Overflow用户

发布于 2012-03-23 23:36:44

假设p位于如下所示的函数中:

代码语言:javascript
复制
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;时,你实际上是在做这样的事情:

代码语言:javascript
复制
mov EBX,[p] ;; get the value of the p variable (a pointer)
mov [EBX],10 ;; dereference the value of p and assign it to 10
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9841999

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档