-
推送 ebp 保持 ebp,sub esp,80h 在堆疊中分配區域性變數,大小為 80h
MOV EBP,ESP 使用 EBP 來指示當前函式的區域性變數、當前函式的引數以及當前函式的返回位址。
mov [ebp+04h], eax [ebp+04h] 儲存當前函式的返回位址,此處修改返回位址,返回 EAX 指向的位址,在當前函式執行完畢後繼續執行。
push 0 是乙個函式引數。
push 'ayra'壓入功能引數。
push 'rbil'壓入功能引數。
push 'daol'壓入功能引數。
推送 esp press-in 函式引數。
推送 edi press-in 函式引數。
call dword ptr ss:[ebp+04h] //call(eax)。呼叫函式由 eax 表示,[ebp+04h]=eax
mov [ebp+08h],eax 獲取 call(eax) 的返回結果,寫入 [ebp+08h],這是當前函式的引數。 由於引數的值被修改,因此該引數是指標或引用。
1:如果 push ebp、sub esp 和 80h 是函式的開頭(即呼叫指令跳到這裡),那麼使用暫存器傳遞函式引數,eax 和 edi 都是函式引數。
2:既然當前函式的返回位址壞了,那麼後面應該有修復操作(A:平衡棧和跳轉 B:重寫[EBP+04] C:其他要修復的操作)。
3:這是乙個shell程式(很可能是由win32程式集編寫的)嗎? 這一段的資訊太少,無法根據上下文來判斷,只能分析這麼多。
-
無緣無故的關於你的話題的程式太多了,雖然我學過編譯,但我看不懂。
這裡沒有太多的邏輯,最好新增偽指令,以便每個人都可以做到。
堆疊之所以進出堆疊,是因為有些暫存器儲存了臨時變數,但是沒有地方放它的初始值,所以只能先儲存,然後再從堆疊中取出,返回原始值。
-
要從整體上看程式,可以根據上下文檢視程式的某個部分做什麼以及為什麼要這樣做。
上帝甚至無法理解這一段,他也說不出他為什麼這樣寫。
-
在你的問題中。
前 3 個原因:
push ebp
sub esp,80h ;為什麼要這樣寫。
mov ebp,esp ;為什麼要這樣寫。
mov [ebp+04h],eax ;為什麼要這樣寫。
這些都是在啟動子程式之前必須完成的事情。
其作用是使 EBP ESP 指向子程式,以便 CPU 可以執行子程式,當子程式結束時,它可以使 EBP ESP 返回呼叫子程式的地方。
還有 2 個原因:
push 0
push 'ayra'
push 'rbil'
push 'daol'
push esp ;為什麼要這樣寫。
push edi ;為什麼要這樣寫。
讓我告訴你乙個技巧。
呼叫前的推送通常是呼叫函式的引數。
例如,呼叫 messagebox、hwnd、lptext、lpcaption、utype,這實際上是執行的推送 utype
push lpcaption
push lptext
push hwnd
call messagebox
還有乙個原因。
call dword ptr ss:[ebp+04h] ;為什麼要這樣寫。
因為你正在拆解它**,所以你或主人很難分辨出這個電話是什麼。
這會導致 SS 指向的 SS:[EBP+04H] 位置,以檢視它是什麼。
最後乙個 1 為什麼。
mov [ebp+08h],eax ;為什麼要這樣寫。
呼叫子例程的結果通常放在 EAX 中
這句話的意思就是把返回結果EAX的內容傳遞給變數[EBP+08H]。
-
code segment
assume cs:code
start:
mov bl,0 ;bl 存款的數量。
mov si,1000h
mov cx,10
op:cmp [si],0
jne op2
inc bl ;如果為零,則加 1。
op2:inc si
loop op;判斷比較的次數。
mov dl,bl;輸出數量。
mov ah,2h
int 21h
code ends
end start
-
就是以16位元組的Qi為乙個和嶺單位,如果小於16位元組,就算作16位元組。
n 16 + 1) * 16 = n(整數部分)+ 16,例如 16 個位元組,佔 16 個位元組。
17 位元組,即 32 位元組。
30 位元組,這也是 Answer 分支佔 32 位元組。
-
next: add [bx+8],sum ;非法記憶體早期核心引用、源運算元和目標運算元不能同時是記憶體。
add [bx+7],30h ;目標運算元需要指定資料型別,並將其更改為:add byte ptr [bx+7], 30h
或 Swift Liquid。 add word ptr [bx+7],30hadd [bx+8],30h ;目的運算元需要指定 Luchang 挖掘型別的數量。
-
缺乏具體分析的條件!
-
;上述程式:
mov dptr, #
mov r2, #50 ;迴圈 50 個迴圈:
mov dph, #01000000b ;源位址比 movx a 高 8 位,@dptr
mov dph, #00100000b ;目標高八位 MOVX @dptr、A
inc dptr
djnz r2, loop
sjmp $
結束---以下程式:
mov dptr, #
mov r2, #50 ;迴圈 50 個迴圈:
mov dph, #10000000b ;源位址比 movx a 高 8 位,@dptr
mov dph, #00100000b ;目標高八位 MOVX @dptr、A
inc dptr
djnz r2, loop
sjmp $end
-
是否看到 DX 和 AL 指定的位址相同? 如果不同也沒關係。
-
彙編比C語言更接近硬體,所以你需要學習微機的原理和微控制器的知識。
我覺得沒關係,現在系統多是用C語言寫的,但是一開始可能用C語言寫的,然後系統比較大,很難改成C++,因為系統比較大,所以我覺得用C++寫就好了,好控制,當然, 速度是要打折扣的,但穩定性和靈活性應該更重要,畢竟慢總比不可修改和舊的崩潰好,C++的速度也不比C差多少,甚至在某些地方更快,因為現在C++的開發比CA快得多 Bjarne Stroustrup說, 學習 C 只是為了處理被當作遺產的**,呵呵。我想知道這是否有點過分? >>>More
組合語言可以說是機器語言,直接與硬體打交道的是將計算機語言轉化為機器可以識別的1001。 它不會過時,至少在這十年內不會。 不過,這主要是關於硬體方面。 >>>More