『壹』 vs反匯編函數入口處指令
這個很簡單ebp-0c0h是給出一段深度為0c0h堆棧,留給你的函數存變數。
因為第一條指令前還有一條指令mov ebp esp所以從ebp到esp是一個深度為0c0h的堆棧,可以想想下esp想當於地面
現在你朝地下挖了個深度為0c0h的洞,ebp現在就是洞底。
然後,rep stos是重復指令,重復次數是 30h 次,表示每次都向那個洞里放0cccccccch,
0ccccccch是4個位元組,放30次,剛好等於第一句指定的堆棧的深度(16進制 30h*4=0c0h,有不理解打開windows
計算器算下)
所以餘下三句的意思就是你把那個洞里全放成了0cccc cccch
為什麼要放0ccccccch?
0cccccccch是個機器指令,是個中斷指令。因為堆棧是存變數的,不可能被執行,所以一旦萬一發生錯誤使堆棧被執行,那也只能執行個中斷
被斷了下來。
《天書夜讀從匯編到windows內核編程》第一章有詳細說明,有什麼不理解你再去參考下吧
『貳』 匯編 radasm win32程序 怎麼指定程序入口地址
前些天,看到這個標題,直接過了,因為這個好像根本不是問題,結果過了幾天,看這個問題還沒有結果,於是好奇,進來看看。
RadASM只是一個開發環境,具體使用什麼語言,你要有那個語言的編譯和鏈接器,放在任何目錄都可以,然後在對應那個語言的xxxx.ini中指定編譯器和連接器的位置,如果是MASM宏匯編,那麼需要在MASM.INI中指定,例如:
[Enviroment]
1=path,c:masm32in;
[CharTab]
2=0251222522222232;20-2F
3=1111111111242221;30-3F
[Open]
0="匯編源文件 (*.asm;*.inc;*.mac;*.txt),*.asm;*.inc;*.mac;*.txt"
1="資源文件 (*.rc),*.rc"
2="文本文件 (*.txt),*.txt"
3="所有文件 (*.*),*.*"
src="匯編文件 (*.asm),*.asm,asm"
hdr="頭文件 (*.inc),*.inc,inc"
mod="模塊 (*.asm;*.mac),*.asm;*.mac"
1=path 這個就是用來定義宏匯編編譯器的地址,填上正確的地址即可。
至於匯編源程序,你完全可以如在DOS環境下使用的那樣,例如:
.data
s1 db '這里放數據『,0
.code
entry proc
mov eax, [eax].PEB.ImageBaseAddress
call GetCurrAddr
mov hInstance[ebx], eax
......
entry endp
.data
s2 db '這里也放數據,當然也可以放到前面去。
.code
start:
mov dest, offset Mz
mov clenth, Len
invoke GetCurrentDirectory,nBufLen, addr szFName
invoke lstrcat,addr szFName, addr myFName
invoke CreateFile,addr szFName, ; pointer to name of the file
GENERIC_WRITE or GENERIC_READ,; access (read-write) mode
null, ; share mode
null, ; pointer to security attributes
CREATE_ALWAYS, ; how to create
FILE_ATTRIBUTE_NORMAL, ; file attributes
NULL
mov hFile, eax
invoke WriteFile,hFile,dest,clenth,addr br,NULL
.if eax
invoke lstrcpy,addr szFName,addr myFName1
invoke lstrcat,addr szFName,addr szOpenOk
invoke MessageBox,null,addr szFName,
addr szCaption,MB_OK
.else
invoke MessageBox,NULL,addr szOpenEr,
addr szCaption,MB_ICONERROR or MB_OK
.endif
invoke CloseHandle,hFile
xor eax, eax
invoke ExitProcess,eax
end start
編譯鏈接後,代碼從 start開始執行,start 的級別比 entry 高,如果代碼中有entry,同時有start,那麼編譯後,結果是start,而不是entry,准確的說法是結尾 end 後面根的啟動地址名稱,隨便叫什麼都可以,習慣上用 start。
這是我以前寫書時寫的一些演示代碼,都是在RadASM中開發的,代碼絕對都可以編譯運行的,我在附件里給你發一個匯編源代碼,你可以試著用RadASM來編譯一下。
『叄』 匯編語言用於指示程序開始的地址的偽指令是
有兩種方式指定程序開始執行的地址:
END偽指令。
格式為END <程序入口標號>
.STARTUP偽指令。(注意前面有個點)
程序將從此處開始執行,無需在END偽指令中指定。
『肆』 匯編 dw 在程序 入口前面,是不是說dw 命令就不執行 程序入口到底是什麼意思
匯編語言中,DW 是偽指令,它在作用是:往存儲器中存放數據。
比如,LED漢字顯示屏,顯示漢字的大量點陣數據,就可以用 DW 來存放。
這樣的點陣數據,是不應該當做程序來執行的,程序的入口,就不應該是 DW 所在的地方。
但是,也有高手,用 DW 指令,向存儲器中,存放指令的機器碼。
這樣的機器碼,是可以當做程序來執行的,程序的入口,就可以是 DW 所在的地方。
『伍』 如何說明匯編程序的入口
匯編語言的注釋是每行從分號「;」開始的,分號之後的內容都屬於注釋。一般而言,匯編語言的注釋在以下幾個地方:
1、程序的最前面,注釋內容一般說明該程序總的說明,解釋程序的主要功能,程序的版本號,程序的修改日誌,程序的編制人等等
2、子程序的前面,一般說明該子程序或函數完成的功能,輸入參數,輸出參數,影響的標志位等等。
3、指令行的後面,注釋該行語句的功能。
比如以下簡單程序的注釋。
;--------------------------------------
;該程序完成一個LED燈的閃爍
;編制時間:XXXXX
;完成人:XXXX
;--------------------------------------
ORG 0000H
LJMP MAIN:
ORG 0030H
MAIN:
CLR P1.0 ;led置低
LCALL DELAY ;延時
SETB P1.0 ;LED置高
LCALL DELAY ;延時
SJMP MAIN ;轉MAIN循環
;------------------------------
;延時子程序
;輸入參數:無
;輸入參數:無
;------------------------------
DELAY:
MOV R2,#200
D1:
MOV R3,#250
DJNZ R3,$
DJNZ R2,D1
RET
END
『陸』 匯編語言指令大全,要詳細的 !!!!
一、數據位傳送指令:
1、MOV C, bit ;bit 可直接定址位 C←(bit)
2、MOV bit,C ;C 進位位 (bit) ← C
二、位變數修改指令:
1、CLR C ; 將C=0
2、CLR bit
3、CPL C ; 將C求反再存入C
4、CPL bit ; 將bit求反再存入bit
5、SETB C ; 將C=1
6、SETB bit ; (bit) ← 1
三、位變數邏輯指令:
ANL C, bit ANL C, bit ORL C, bit ORL C, bit
『柒』 匯編語言 ENTRY 是什麼指令
在ARM匯編中,ENTRY 是一個偽指令,用於指定匯編程序的入口點。在一個較大型的完整的匯編程序(多個源文件組成的工程)中至少要有一個ENTRY(也可以有多個,當有多個ENTRY時,程序的真正入口點由鏈接器指定),但在某一個源文件里最多隻能有一個ENTRY(可以沒有)。
『捌』 51單片機匯編程序入口後加的跳轉指令"LJMP"是因為什麼 如:ORG 0 LJMP STAR ORG 0003H LJMP INT0S
要弄明白這個問題,你要對51單片機的中斷有一個初步的了解,我可以給你介紹一下。
比方說你希望不管程序運行到哪裡,只要你一按某個按鍵,就執行一段你預先寫好的程序,然後再回到原來的地方繼續。你按按鍵的動作可以視為單片機的一個I/O管腳電平由高到低(如果你把按鍵接在I/O和地之間)。在51單片機中,有兩個I/O可以實現這樣的功能(這就是外中斷,ORG
0003H
LJMP
INT0S
中的INT0S就是外中斷0,具體你可以查51單片機中斷系統的資料)。
那它到底是怎樣實現的呢?比方說,某一時刻,你的按鍵按下了,處理器會知道滿足了外中斷的觸發條件,那它會執行哪一段程序呢?設計師人為地給它規定了一個固定的地址,如外中斷0被觸發時就是跳到地址為0003H的單元開始執行,別的中斷(定時器等)同理,都有一個固定的地址,一旦被觸發就會自動跳到那個地址,這就是中斷向量。
那為什麼是0003H而不是程序存儲器的末尾呢?這是因為不同51單片機的存儲器大小是不同的,如果中斷向量也因此而不同的話,單片機開發的麻煩就太多了。所以設計師乾脆就把中斷向量放在開頭。單片機復位後是從0000H開始執行的,總不能讓它一開始就無緣無故中斷,所以要轉移到一個和中斷向量不相乾的地方執行主程序。ORG
0
LJMP
STAR(其實應該是START)就是這樣一個轉移指令,轉到標記為START的主程序處開始執行。一條LJMP指令的長度為3,這也就是第一個中斷向量為0003H的原因了(不浪費一絲空間,不得不佩服Intel設計師的高明)。
ORG
0003H
LJMP
INT0S
為什麼中斷向量處還要跳轉呢?這是因為中斷向量間的空間也很有限,只能完成一些最簡單的任務,稍微長一點的程序就需要放在更大的空間里,從中斷向量處跳轉到該處執行真正的中斷服務程序。
有關中斷系統的具體內容,建議你還是看看相關資料,我只是把它的基本原理和你講了一下,真正使用還是請你自己探索。
『玖』 jne的匯編指令是什麼
匯編指令是匯編語言中使用的一些操作符和助記符,還包括一些偽指令(如assume,end)。用於告訴匯編程序如何進行匯編的指令,它既不控制機器的操作也不被匯編成機器代碼,只能為匯編程序所識別並指導匯編如何進行。
jne是匯編指令中的一個條件轉移指令。當ZF=0,轉至標號處執行。