http://www.softwarematrix.cn/blog/
题目:用标准C++模拟一个简单的汇编环境
背景简介:32位汇编使用EAX,EBX,ECX,EDX寄存器,但是兼容16位的寄存器 AX,BX,CX,DX,AL,BL,CL,DL,AH,BH,CH,DH 比如说,当你想改变EAX的低8个bit时,只需要改变AL就可以了
现在我需要通过标准C++模拟一个这样的环境,
这个环境支持两个函数: 一、mov 模拟汇编的mov指令,第一个参数是目的,第二个参数是数据源 比如以下是mov可能的几种形式:
int i; mov(i, EBX); //把EBX中的内容移入i mov(EAX, EBX); //把EBX中的内容移入EAX mov(AX, 3); // 把3移入AX mov(AL, i - 1); // 把i-1移入
注意: 1、目的操作数不能为立即数 2、操作的字长和目的操作数有关,否则截断。比如AX是个16位的寄存器, mov(AX, 0xabcdef)会截断高位,经过此操作以后AX变成0xcdef。
二、disp 16进制打印函数,可以只支持寄存器,要求打印指定寄存器中的值,不足位的补0。 假定EAX中的值为0x0a010b01 则disp(EAX);diap(AX);disp(AH)的输出分别是
0a010b01 0b01 0b
注意:寄存器并不是真正的CPU的寄存器,只需要模拟出来就好了,比如定义变量的方式 <题目来自: http://community.csdn.net/Expert/topic/4478/4478436.xml?temp=.8326227 >
// programmed by zerodspace #include "iostream.h" #include "iomanip.h"
char eax[4]; char ebx[4]; char ecx[4]; char edx[4];
#define EAX (*(int*)eax) #define EBX (*(int*)ebx) #define ECX (*(int*)ecx) #define EDX (*(int*)edx)
#define AX (*(short*)eax) #define BX (*(short*)ebx) #define CX (*(short*)ecx) #define DX (*(short*)edx)
#define AL (*(char*)eax) #define BL (*(char*)ebx) #define CL (*(char*)ecx) #define DL (*(char*)edx)
#define AH (*(char*)&eax[1]) #define BH (*(char*)&ebx[1]) #define CH (*(char*)&ecx[1]) #define DH (*(char*)&edx[1])
#define mov(a,b) ((a)=(int)(b)) #define disp(a) (cout<<hex<<setw(8)<<setfill('0')<<(int)a<<endl)
int main() { int i = 0xabcd; mov(EAX, i); mov(BX, 0xabcdef); mov(AL, 0xd1); mov(BH, 0xbbb); disp(EAX); disp(EBX); return 0; }