在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的阿,但这里怎么解释呢?
...
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的阿,但这里怎么解释呢?
依希记得 访问码+指令+参数!!!
访问码决定后面的参数是寄存器直接,寄存器间接,内存直接什么的寻址方式!!!
指令是就是mov,add,sub等的代码!!!
参数就是一些数值,长度和意义由访问码来决定!!!!
所以一条指令的长度是可变的!!!!
看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++代码编译成机器码过程中中间那步先转变成汇编
语言所得到的汇编代码呢,还是根据最后的机器码反汇编得到的汇编代码呢?