在VC中调试程序时,可以在调试窗口里看到disassembly窗口,里面对应的汇编代码,比如...
...
373:       if (InitCard(AfxGetMainWnd())==0)
00402709   call        AfxGetMainWnd (00402d9c)
0040270E   mov         esi,esp
00402710   push        eax
00402711   call        dword ptr [__imp__InitCard (004187c8)]
00402717   add         esp,4
0040271A   cmp         esi,esp
0040271C   call        _chkesp (00402dae)
00402721   and         eax,0FFh
00402726   test        eax,eax
00402728   jne         CSerialPortTestDlg::OnButtonInitCard+6Ah (0040273a)
374:           AfxMessageBox("初始化卡成功!");
0040272A   push        0
0040272C   push        0
0040272E   push        offset string "\xb3\xf5\xca\xbc\xbb\xaf\xbf\xa8\xb3\xc9\xb9\xa6!" (00416550)
00402733   call        AfxMessageBox (00402da8)
375:       else
00402738   jmp         CSerialPortTestDlg::OnButtonInitCard+78h (00402748)
...最前面一列的应该是汇编代码的PC值,但是为什么不连续呢?到了汇编层次,应该就是一条汇编指令翻译成一条机器码,运行时PC指向下一条指令,然后自动加1的阿,但这里怎么解释呢?

解决方案 »

  1.   

    你仔细看看x86的指令的表示方法!!
    依希记得   访问码+指令+参数!!!
    访问码决定后面的参数是寄存器直接,寄存器间接,内存直接什么的寻址方式!!!
    指令是就是mov,add,sub等的代码!!!
    参数就是一些数值,长度和意义由访问码来决定!!!!
    所以一条指令的长度是可变的!!!!
      

  2.   

    cpu只有读了某一条指令后,才能决定下一条指令是什么!!!!!
      

  3.   

    刚在查80x86的指令集的文档,想随便找条指令验证一下
    看push这条指令
    Opcode* Instruction   64-Bit Mode     Compat/Leg Mode        Description
    ...
    6A      PUSH imm8       Valid           Valid            Push sign-extended imm8.
    68      PUSH imm16      Valid           Valid            Push sign-extended imm16.
    68      PUSH imm32      Valid           Valid            Push sign-extended imm32.
    ...
    但是看一开始的反汇编中,
    374:           AfxMessageBox("初始化卡成功!");
    0040272A   push        0
    0040272C   push        0
    编译器怎么根据push 0指令就确定0是一个8bit的立即数呢?是自动分配能放下这个立即数的最小size吗?另外,VC中的disassemble窗口看到的汇编是C++代码编译成机器码过程中中间那步先转变成汇编
    语言所得到的汇编代码呢,还是根据最后的机器码反汇编得到的汇编代码呢?