1.(mov ecx,dword ptr [ebp-0Ch])将this指针压入ecx 2.(mov edx,dword ptr [ecx])this指针指向该对象的首地址,而该处的前四个字节存放着该对象的虚函数表的首地址,将虚表指针放到edx中。 3.(call dword ptr [edx+4] ...
分类:
其他好文 时间:
2017-09-02 01:05:55
阅读次数:
115
8086 CPU 寻址方式灵活。有以下几种 idata 表示常量 1. [ idata ] 用一个常量来表示地址,可用于直接定位内存单元,但是在 MASM中要显实在的说明 ds 段寄存器, 比如 mov ax, ds:[0] ,表示把 ds 寄存器中所在段的地址+偏移地址 0 的内存单元中的值赋给a ...
分类:
其他好文 时间:
2017-08-26 10:22:29
阅读次数:
131
在ARM架构下, 数据从内存到CPU之间的移动只能通过LDR/STR指令来完成.而MOV只能在寄存器之间移动数据,或者把立即数移动到寄存器中,并且数据的长度不能超过8位 LDR,STR 的第一操作数是目标寄存器,第二操作数是内存地址, LDR 内存 --> 寄存器; STR 寄存器 --> 内存 内 ...
分类:
其他好文 时间:
2017-08-24 14:54:08
阅读次数:
175
MOV PC,LR BL NEXT ;跳转到子程序 ......... ;NEXT处执行 NEXT .......... MOV PC,LR ;从子程序返回 这里的BL是跳转的意思,LR(R14)保存了返回地址 PC(R15)是当前地址,把LR给PC就是从子程序返回 这里有一下总结 首先 1.SP( ...
分类:
其他好文 时间:
2017-08-24 13:29:01
阅读次数:
209
都不是原子操作。理由: 1.i++分为三个阶段: 内存到寄存器寄存器自增写回内存这三个阶段中间都可以被中断分离开. 2.++i首先要看编译器是怎么编译的, 某些编译器比如VC在非优化版本中会编译为以下汇编代码: __asm{ moveax, dword ptr[i] inc eax mov dwor ...
分类:
其他好文 时间:
2017-08-20 20:06:04
阅读次数:
138
段寄存器: 在使用汇编写某个地址时:mov dword ptr ds:[0x123456],eax 其实我们真正读写的地址是:ds.base + 0x123456 而段寄存器共有八个 分别为: ES CS SS DS FS GS LDTR TR 2.段寄存器的结构. 段寄存器共96位 其中80位不可 ...
分类:
其他好文 时间:
2017-08-20 14:09:24
阅读次数:
198
32位通用寄存器 32位:EAX EBX ECX EDX ESP EBP ESI EDI 每个寄存器的最大宽度是32位 16位:AX BX CX DX SP BP SI DI 8位 :AL BL CL DL AH BH CH DH 想寄存器存一个数字可以用mov指令 mov eax,1 就是把1存到 ...
分类:
其他好文 时间:
2017-08-13 20:09:53
阅读次数:
310
mov ax, offset 标号:取得标号相对于伪代码后第一条指令地址0的相对偏移量即标号地址 可以发现汇编指令中的idata会直接反映在机器码中 jmp指令可以修改IP或CS和IP的值,具体格式如下: ①jmp short 标号(段内转移) (IP) = (IP)+ 8位位移 8位位移含义是:标 ...
分类:
其他好文 时间:
2017-08-05 23:41:02
阅读次数:
378
在.asm文件中写mov al, [0],对于编译器来说只是将0赋值给al(不过写[0]相当于写ds:[0],写[1],[2]....这些就不相同了) 为了表示我们想要的ds:[0]: 1.改写成mov al, ds:[0] 2. mov bx, 0 mov al, [bx] 所以bx寄存器基本上与 ...
分类:
其他好文 时间:
2017-08-03 23:39:52
阅读次数:
170
看代码: 1 #include <stdio.h> 2 #include <fcntl.h> 3 int key1(){ 4 asm("mov r3, pc\n"); 5 } 6 int key2(){ 7 asm( 8 "push {r6}\n" 9 "add r6, pc, $1\n" 10 " ...
分类:
其他好文 时间:
2017-08-03 12:37:05
阅读次数:
290