用标准C++模拟一个简单的汇编环境

    技术2022-05-11  134

    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; }


    最新回复(0)