我是ASM和C / C ++的新手。许多网站向我展示了一张图片,不仅指针指向"指向"他们存储的地方(地址);而且还有君姆。请有人告诉我" ASM JUMP指令和C / C ++指针之间的主要区别是什么?#34;。谢谢你们。
答案 0 :(得分:6)
指针用于存储变量的地址。
处理器使用ASM JUMP开始从地址执行代码。
我认为没有任何相关的理由来区分两者,因为它们都是不同的概念,并且出于不同的原因使用。
答案 1 :(得分:2)
它们不相似,指针只是地址,由于抽象,它们在c / c ++中看似神秘但在汇编时指针可能是一个寄存器,其中存储了一个“指向”某些数据的地址,EIP是在程序执行期间“指向”当前指令的指针,整个想法是复制指向数据的地址比数据本身“更便宜”。
我认为混淆来自于c / c ++是强类型语言并且汇编是松散类型的事实。
关于强类型和弱类型的wiki article解释了这一切,它有关于指针的说法..
<强>指针强>
某些编程语言将指针视为数值,并允许用户对它们执行算术运算。这些语言有时被称为“弱类型”,因为指针算法可用于绕过语言的类型系统。
即使这样说,如果你读到这个tutorial on pointers,它说;
a[5] = 0; // a [offset of 5] = 0
*(a+5) = 0; // pointed by (a+5) = 0
这两个表达式是等价的,当你想到它时会有意义。
a
只是汇编中数组的指针,你可能有类似的东西;
.data
a db "some data"
.data
是指向数据所在地址的指针
a:
也是指向地址的指针,该地址从's'
中字节"some data"
的定义之前的程序中的标签a开始,就像c中的指针a一样;
char a[] = "some data"; // or
char *a = "some data"; // and a is the start address
访问它们看起来像;
a[5] == 'd' && *(a+5) == 'd'; // true
指向一个样子;
char *b = a;
访问在程序集中看起来像这样;
mov al, byte[a+5] // calculates effective address or points to the 'd'
cmp al, 'd' // if al == 'd'
je some_appropriate_label // je(jump if equal) somewhere anywhere
//(some_appropriate_label being an address or pointer to the begining of some appropriate code)
指向或获取程序集中的地址看起来像;
mov ebx, a // moves the address that a represents into ebx
mov bl, byte[ebx+5] // moves 'd' into bl
在装配中,一切都很暴露。
我觉得要为你做一些额外的调查,我做了一个名为test.c的简单的c程序;
int main(){
char *pointer1 = "some data";
char *pointer2 = pointer1;
}
并通过gcc -S -masm=intel -fno-asynchronous-unwind-tables -fno-dwarf2-cfi-asm test.c
提供gcc
以获得test.s
等同于test.c
的程序集,这就是文件;
.file "test.c"
.intel_syntax noprefix
.def ___main; .scl 2; .type 32; .endef
.section .rdata,"dr"
LC0:
.ascii "some data\0"
.text
.globl _main
.def _main; .scl 2; .type 32; .endef
_main:
push ebp
mov ebp, esp
and esp, -16
sub esp, 16
call ___main
mov DWORD PTR [esp+12], OFFSET FLAT:LC0
mov eax, DWORD PTR [esp+12]
mov DWORD PTR [esp+8], eax
leave
ret
.ident "GCC: (rev2, Built by MinGW-builds project) 4.8.1"
注意这些部分;
LC0:
.ascii "some data\0"
和
call ___main
mov DWORD PTR [esp+12], OFFSET FLAT:LC0
mov eax, DWORD PTR [esp+12]
mov DWORD PTR [esp+8], eax
看起来这个程序正在使用堆栈来存储它的指针,esp
是堆栈指针,它包含任何时候堆栈顶部的地址或指针。
<强>指针1 强>
mov DWORD PTR [esp+12], OFFSET FLAT:LC0 // moves address where data lives into stack
// this is where pointer1 lives
<强>指针2 强>
mov eax, DWORD PTR [esp+12] // moves address/pointer into eax from stack
mov DWORD PTR [esp+8], eax // moves address/pointer into pointer2
// esp+12 is the c pointer (think *(a+0) a[0] from c but instead of char 's' it's an address(dword),
// LCO is the data that was moved into the pointer which is also an address
// The second line is basically saying;
// move the 4byte address to the topOfStack+8bytes