困惑已久的问题 保护模式下程序运行时如何寻址,直接用线性地址那还是段基地址+段内偏移?
.386
.model flat, stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
includelib kernel32.lib
include \masm32\include\user32.inc
includelib user32.lib
.data
MsgCaption db "Iczelion's tutorial no.2",0
MsgBoxText db "Win32 Assembly is Great!",0
.code
start:
invoke MessageBox, NULL,addr MsgBoxText, addr MsgCaption, MB_OK
invoke ExitProcess,NULL
end start
上面的代码编译后 在win32Dasm中反汇编结果如下
//******************** Program Entry Point ********
:00401000 6A00 push 00000000
:00401002 6800304000 push 00403000 ;此处压入堆栈的地址是线性
; 还是段内偏移地址
* Possible StringData Ref from Data Obj ->"Win32 Assembly is Great!"
|
:00401007 6819304000 push 00403019 ; 疑问同上
:0040100C 6A00 push 00000000
* Reference To: USER32.MessageBoxA, Ord:01BBh
|
:0040100E E80D000000 Call 00401020 ; 此处调用是段间转移吗?
; 地址是线性地址还是段偏
; 移地址 为什么没有选择子
:00401013 6A00 push 00000000
* Reference To: KERNEL32.ExitProcess, Ord:0075h
|
:00401015 E800000000 Call 0040101A ;疑问同上
* Referenced by a CALL at Address:
|:00401015
|
* Reference To: KERNEL32.ExitProcess, Ord:0075h
|
:0040101A FF2500204000 Jmp dword ptr [00402000]
* Reference To: USER32.MessageBoxA, Ord:01BBh
|
:00401020 FF2508204000 Jmp dword ptr [00402008]
:00401026 00000000000000000000 BYTE 10 DUP(0)