eax:eax 是"累加器"(accumulator),它是很多加法乘法指令的預設暫存器。
ebx:是"基位址"(base)暫存器, 在記憶體定址時存放基位址。棧底指標。
esp:暫存器存放當前執行緒的棧頂指標
ecx:是計數器(counter), 是重複(rep)字首指令和loop指令的內定計數器。
edx:則總是被用來放整數除法產生的餘數。
ebp:「基址指標」, 它最常被用作高階語言函式呼叫的"框架指標"(frame pointer).
在破解的時候,經常可以看見乙個標準的函式起始**:push ebp ;儲存當前ebp
mov ebp,esp ;ebp設為當前堆疊指標
sub esp, *** ;預留***位元組給函式臨時變數.
eip:暫存器存放下乙個cpu指令存放的記憶體位址,當cpu執行完當前的指令後,從eip暫存器中讀取下一條指令的記憶體位址,然後繼續執行。
esi\edi:esi/edi分別叫做"源/目標索引暫存器"(source/destination index),因為在很多字串操作指令中, ds:esi指向源串,而es:edi指向目標串.
mov:在此過程中將乙個暫存器中的值移到另乙個暫存器。
jmp:是無條件轉移指令,用做強行跳轉。
call:可以理解為goto。並將它的下一行指令位址存到棧中。是子程式呼叫指令,和ret子程式返回配對使用。
call指令的步驟:首先是將返回位址(也就是call指令要執行時eip的值)壓入棧頂,然後是將程式跳轉到當前呼叫的方法的起始位址。執行push和jump指令。
push:為入棧命令。 push指令在程式中常用來暫存某些資料。
pop:為出棧命令。而pop指令又可將這些資料恢復棧命令都跟伴隨棧指標的移動。影響esp
ret:也可以理解為goto。並移動棧指標。
ret指令則是將棧頂的返回位址彈出到eip,然後按照eip此時指示的指令位址繼續執行程式。
n 個人圍成一圈,每個人都有乙個互不相同的密碼,該密碼是乙個整數值,選擇乙個人作為起點,然後順時針從 1 到 k(k為起點人手中的密碼值)數數。數到 k 的人退出圈子,然後從下乙個人開始繼續從 1 到 j (j為剛退出圈子的人的密碼)數數,數到 j 的人退出圈子。重複上面的過程,直到剩下最後乙個人。
/*約瑟夫環*/
#include #include #define n 9 //環中人的個數
#define overflow 0
int keyw[n]=; //每個人手中的密碼
typedef struct lnodelnode,*linklist;
void joseph(linklist p,int m,int x)
p->next=q->next; //刪除q
i=q->keyword; //得到下乙個要刪除的人的位置
printf("%d ",q->keyword);
free(q);
joseph(p,i,x-1); //遞迴呼叫 總人數減1,輸入新的密碼}
int main()
p->next=lhead; //構造迴圈鍊錶
printf("請輸入第一次計數值m :\n");
scanf("%d",&m);
printf("輸出的佇列是:\n");
joseph(p,m,n);
return 0;
}
關於暫存器
32位機裡完整的保留了16位定址模式。即 定址能力為1m 分段機制 每段不超過64kb。這就是通常所說的 實模式 在位址儲存模型中屬於 實位址儲存模型 其次,考慮到程式通常都是功能化的模組,所以分段雖然不是必要的,但分段卻能大大提高程式設計者管理程式的效率。故而32位機也採用了段 偏移的模式來定址。...
暫存器(通用暫存器)
因為學習使用的是王爽的 組合語言 第3版 因此也只能提到8086cpo的暫存器。對於其他而言,原理都是相通的。對於8086暫存器,有14個暫存器,主要是 ax bx cx dx si di sp bp ip cs ss ds es psw。一 通用暫存器 8086的通用暫存器有ax bx cx dx...
暫存器,標誌暫存器
涉及硬體傳輸資料的,往往包含以下內容 1.資料傳輸引腳 資料放 2.控制引腳 怎麼控制 3.狀態引腳 結果如何 暫存器相當於cpu內部的儲存單元,可能是連續排列,相當於 c語言中的陣列。一 8個通用暫存器 16 bit accumulate axah alr0 count cxch clr1 dat...