第二章--組合語言

看雪資料發表於2003-03-07

第二章--組合語言
稍微有點兒計算機知識的朋友一定知道,計算機是隻識別0和1的,最初那會兒,要寫程式,就要用0和1來寫,呵呵,Cool吧!所以曾經有過的對程式設計師的崇拜,可能就源自那個時候吧 第二章--組合語言 後來,人們發現用0和1來寫程式,太不爽了,不但寫起來不上手,而且回過頭來看的話,應該很難再看明白了,總之出於這些原因,就有了組合語言。
組合語言用一些助記符來代替0和1的多種組合,也就是各個指令,這樣的話,從一定程度上來說,方便了許多(一頭老牛:方便太多了)(一隻菜鳥:一點兒也不方便,完全看不懂)。但是,彙編也同樣不方便,同樣寫起來不爽,而且後期維護同樣不方便,再加上人們慢慢地需要寫一些更大的程式,在這樣的情況下,高階語言就被人發明了出來,就是我們今天用的Basic、pascal、C、C++等等等等,這些語言的出現,一下了使程式的開發難度大大減低了(一頭老牛:減低太多了,我膝蓋就能寫程式了)(一隻菜鳥:還不是一樣難),以前用匯編要很長時間才能開發出來的程式,現在只需要很短的時間且很輕鬆的就可以搞定了,特別是最近幾年,視覺化程式設計的大肆普及,使程式設計師的神祕感一下子摔了下來,Coder這樣的詞現在都滿天飛了。最慘的就是彙編,一夜之間變成了低階語言、下流的語言、吃完大蒜不刷牙的民工、開車加完油不給錢的地痞、在公共汽車上吐口水的冰島人等等等等 第二章--組合語言
(彙編:嗚嗚嗚…我不活了)。
但是彙編還是有它先天的優勢的,因為其與CPU內部的指令一一對應,所以在一些特殊的場合,必須由彙編來實現,比如訪問硬體的埠、寫病毒….
而且生成的可執行檔案效率巨高,且生成的可執行檔案賊小,寫小程式是很爽的,呵呵,而且用匯編寫序號產生器,是件很輕鬆的事,你不用再為怎樣還原為你所熟悉的語言而為難。說了這麼多,還是切入主題吧(昏倒觀眾若干):
既然計算機只識別0和1,那麼,所有儲存在計算機上的檔案,也都是以二進位制的形式存放的,當然也包括可執行檔案了。
所以,你只要找一個十六進位制編輯器比如Ultra Edit什麼的,就可直接開啟並檢視可執行檔案了,呵呵,如果你能看懂的話 第二章--組合語言 你會發現,此時看到的,全是些十六進位制數值(每4位二進位制數可轉換為一位十六進位制數),這就是可執行檔案的具體內容,當然,其中就包括可執行檔案的程式碼了。(一頭老牛:好親切啊)(一隻菜鳥:笨牛,你給我閉嘴,我眼都花了)。
呵呵,此時,你是不是覺得看這些東西,有些那個?
這些東西看起來就像有字天書,沒人能靠這玩意兒來進行分析,於是乎。就有了相應的軟體,可以將這些十六進位制數值轉換為相應的彙編程式碼,這樣的話,我們就可以對別人的軟體進行分析了。這就是所謂的逆向分析了。
呵呵,聰明的你現在一定在想,如果找到軟體計算註冊碼的部分,並對其進行分析,弄懂它的計算方法,那麼你不就不用通過¥的方式來進行軟體註冊了嗎?當然,你也可以將此計算過程還原為任意一個你所熟悉的程式語言,那麼,編譯後的這個程式,就叫做序號產生器,它的功能就是計算某一特定軟體的註冊碼。(呵呵,是不是經常在軟體中看到此類說明?"禁止製作和提供該軟體的序號產生器及破解程式;禁止對本軟體進行反向工程,如反彙編、反編譯等")
作者這樣做,心情我們是可以理解的,畢竟人家花了那麼多心思在自己的軟體上,所以,我不希望你僅僅是因為交不起註冊費的原因來學習破解。
總的說來,上邊兒的介紹有點兒太理想化了,上面提到的分析方法,就是所謂的靜態分析,此類分析常用的工具有W32DASM、IDA和HIEW等。靜態分析,顧名思義,就是隻通過檢視軟體的反彙編程式碼來對軟體進行分析。一般如果只是想暴破軟體,只進行靜態分析就夠了。但要想真正的弄清註冊演算法,一般還是要進行動態分析的,即能過偵錯程式來一邊執行程式一邊進行分析。具體內容,我會在《破解原理》和《偵錯程式入門》中詳細說明,呵呵,畢竟現在都以經有點兒跑題了。
我廢話說了這麼多,其實就是想告訴你彙編的重要性,我不要求你精通,但最少你也得能看懂吧,要不,還談什麼分析?雖然有哥們兒一點兒彙編都不懂就上路了,甚至還破掉了幾個軟體,但是,這樣是不是慘了點兒?難不成你想暴破軟體暴破一輩子?
其實你完全不用懼怕彙編的,看上去怪嚇人的,其實跟你平時背那些控制元件的屬性方法差不多,MFC那麼多你都搞的定,彙編命令才有多少?而且,彙編不光只是在Crack軟體時有用,在好多地方也都有用,且用處巨大,所以我覺得,把彙編拿下,是件義不容辭的事:
你只要相信它並不難就好了。

(以下為第二次修改時加入)
先給你講一下CPU的組成吧:
CPU的任務就是執行存放在儲存器裡的指令序列。為此,除要完成算術邏輯操作外,還需要擔負CPU和儲存器以及I/O之間的資料傳送任務。早期的CPU晶片只包括運算器和控制器兩大部分。到了近幾年,為了使儲存器速度能更好地與運算器的速度相匹配,又在晶片中引入了高速緩衝儲存器(知道為什麼P4比P4賽揚貴那麼多嗎?)。(當!一個硬物飛了過來,話外音:你講這些做什麼,我們又不要設計CPU)
你急什麼嘛,由於彙編比較“低階” ;;所以它是直接操作硬體的,你以為這是用VB呢,想什麼時候用變數隨手就可以拿來用,你不掌握好CPU內部的一些工作分配情況,到時怎麼來看彙編程式碼啊。(當!又一聲,重要還不快點兒說)
除了高速緩衝儲存器之外的組成,大體上可以分為3個部分:
1.算術邏輯部件ALU(arithmetic logic unit)用來進行算術和邏輯運算。這部分與我們的關係不太大,我們沒必要管它。
2.控制邏輯。同樣與我們的關係不大。
3.這個才是最最重要的。工作暫存器,它在計算機中起著重要的作用,每一個暫存器相當於運算器中的一個儲存單元,但它的存取速度卻賊快賊快,比儲存器要快很多了。它用來存放計算過程中所需要的或所得到的各種資訊,包括運算元地址、運算元及運算的中間結果等。下面我們專門的介紹這些暫存器。
在介紹之前,有必要說點兒基礎性的知識。知道什麼是32位吧,就是說暫存器是32位的,暈~~等於沒說。在CPU中,一個二進位制位被看作是一位,八位就是一個位元組,在記憶體中,就是以位元組為單位來在儲存資訊的,每一個位元組單元給以一唯一的儲存器地址,稱為實體地址,到時候訪問相應的記憶體,就是通過這個地址。八個二進位制位都能表達些什麼呢?可以表達所有的ASCII碼,也就是說一個記憶體單元可以儲存一個英文字元或數字什麼的,而中文要用Unicode碼來表示,也就是說兩個記憶體單元,才能裝一個漢字。十六位就是兩個位元組這不難理解吧,當然啦,那有了十六位,就肯定有三十二位六十四位什麼的,三十二位叫做雙字,六十四位就叫做四字。今天我們所使的CPU,相信全是32位的了,除非你用的是286或更早的話。自然而然,CPU中的暫存器,也就是32位的了,也就是說一個暫存器,可以裝下32個0或1(這其中不包括段暫存器)。
大體上來說,你需要掌握的暫存器,有十六個,我一個一個給介紹給你:
首先,介紹小翠兒(當!,我自己打我自己一下得了,最近看周星馳看多了),重說,首先,介紹通用暫存器。
一共八個,分別是EAX、EBX、ECX、EDX、ESP、EBP、EDI、ESI。
其中,EAX―EDX這四個暫存器又可稱為資料暫存器,你除了直接訪問外,還可分別對其高十六位和低十六位(還計的我說它們是32位的嗎?)進行訪問。它們的低十六位就是把它們前邊兒的E去掉,即EAX的低十六位就是AX。而且它們的低十六位又可以分別進行八位訪問,也就是說,AX還可以再進行分解,即AX還可分為AH(高八位)AL(低八位)。其它三個暫存器請自行推斷。這樣的話,你就可以應付各種情況,如果你想操作的是一個八位資料,那麼可以用 MOV AL (八位資料)或MOV AH (八位資料),如果你要操作的是一個十六位資料,可以用MOV AX (十六位資料)三十二位的話,就用MOV EAX (三十二位資料)也許我這樣說,你還是會不明白,沒關係,慢慢來,我給你大概畫張圖吧,雖然不怎麼漂亮:
───────────────────────
│                    │          │          │
│                    │          │          │
│     高十六位      EAX    AH  AX    AL      │
│                    │          │          │
│                    │          │          │
───────────────────────
(我倒啊...這個圖為啥老是不能正常顯示?我都重畫三遍了) 第二章--組合語言
明白了嗎?不明白沒有關係,你就按你自己的理解能力,能理解多少,就理解多少。
這四個暫存器,主要就是用來暫時存放計算過程中所用的運算元、結果或其它資訊。
而ESP、EBP、EDI、ESI這四個呢,就只能用字來訪問,它們的主要用途就是在儲存器定址時,提供偏移地址。因此,它們可以稱為指標或變址暫存器。話說回來,從386以後,所有的暫存器都可以用來儲存記憶體地址。(這裡給你講一個小知識,你在破解的時候是不是看到過[EBX]這樣的形式呢?這就是說此時EBX中裝的是一個記憶體地址,而真正要訪問的,就是那那個記憶體單元中所儲存的值)。
在這幾個暫存器中,ESP稱為堆疊指標寄存。堆疊是一個很重要的概念,它是以“後進先出”方式工作的一個儲存區,它必須存在於堆疊段中,因而其段地址存放於SS暫存器中。它只有一個出入口,所以只有一個堆疊指標暫存器。ESP的內容在任何時候都指向當前的棧頂。我這樣說你可能會覺的還是不明白,那我舉個例子吧,知道民工蓋房吧,假設有兩個民工,一個民工(以下簡稱民工A)要向地上鋪磚,另一個民工(以下簡稱民工B)給民工A遞磚,民工A趴在地上,手邊是民工B從遠處搬來的板磚,他拿起來就用,民工B從遠處搬來後,就還放在那一堆磚上,這樣,民工A拿著用後,民工B隨既就又補了上去,這就是後進先出。你在腦子裡想象一下這個這程。有沒有想明白,民工A永遠是從最上邊開始拿磚。堆疊就是這樣,它的基址開始於一個高地址,然後每當有資料入棧,它就向低地址的方向進行儲存。相應的入棧指令是PUSH。每當有資料入棧,ESP就跟著改變,總之,它永遠指向最後一個壓入棧的資料。之後,如果要用壓入堆疊的資料,就用出棧指令將其取出。相應的指令是POP,POP指令執行後,ESP會加上相應的資料位數。
特別是現在到了Win32系統下面,堆疊的作用更是不可忽視,API所用的資料,均是靠堆疊來傳送的,即先將要傳送的資料壓入堆疊,然後CALL至API函式,API函式會在函式體內用出棧指令將相應的資料出棧。然後進行操作。以後你就會知道這點的重要性了。許多明碼比較的軟體,一般都是在關鍵CALL前,將真假兩個註冊碼壓入棧。然後在CALL內出棧後進行比較。所以,只要找到個關鍵CALL,就能在壓棧指令處,下d命令來檢視真正的註冊碼。具體內容會在後面詳細介紹,本章暫不予討論。
另外還有EBP,它稱為基址指標暫存器,它們都可以與堆疊段暫存器SS聯用來確定堆疊中的某一儲存單元的地址,ESP用來指示段頂的偏移地址,而EBP可作為堆疊區中的一個基地址以便訪問堆疊中的資訊。ESI(源變址暫存器)和EDI(目的變址暫存器)一般與資料段暫存器DS聯用,用來確定資料段中某一儲存單元的地址。這兩個變址暫存器有自動增量和自動減量的功能,可以很方便地用於變址。在串處理指令中,ESI和EDI作為隱含的源變址和目的變址暫存器時,ESI和DS聯用,EDI和附加段ES聯用,分別達到在資料段和附加段中定址的目的。目前暫時不明白不要緊。
接下來,再介紹如花(噹噹噹,我再打自己三下算了)接下來,介紹一下專用暫存器,呵呵,有沒有被這個名字嚇倒?看起來怪專業的。
所謂的專用暫存器,有兩個,一個是EIP,一個是FLAGS。
我們先來說這個EIP,可以說,EIP算是所有暫存器中最重要的一個了。它的意思就是指令指標暫存器,它用來存放程式碼段中的偏移地址。在程式執行的過程中,它始終指向下一條指令的首地址。它與段暫存器CS聯用確定下一條指令的實體地址。當這一地址送到儲存器後,控制器可以取得下一條要執行的指令,而控制器一旦取得這條指令就馬上修改EIP的內容,使它始終指向下一條指令的首地址。可見,計算機就是用EIP暫存器來控制指令序列的執行流程的。
那些跳轉指令,就是通過修改EIP的值來達到相應的目的的。
再接著我們說一下這個FLAGS,標誌暫存器,又稱PSW(program status word),即程式狀態暫存器。這一個是存放條件標誌碼、控制標誌和系統標誌的暫存器。
其實我們根本不需要太多的去了解它,你目前只需知道它的工作原理就成了,我舉個例子吧:
Cmp EAX,EBX  ;用EAX與EBX相減
JNZ 00470395   ;不相等的話,就跳到這裡;
這兩條指令很簡單,就是用EAX暫存器裝的數減去EBX暫存器中裝的數。來比較這兩個數是不是相等,當Cmp指令執行過後,就會在FLAGS的ZF(zero flag)零標誌位上置相應值,如果結果為0,也就是他們兩個相等的話,ZF置1,否則置0。其它還有OF(溢位標誌)SF(符號標誌)CF(進位標誌)AF(輔助進位標誌)PF(奇偶標誌)等。
這些你目前沒必要了解那麼清楚,會用相應的轉移指令就行了。
最後要介紹的就是段暫存器了(剛才是誰說的櫻紅?反正不是我)
這部分暫存器一共六個,分別是CS程式碼段,DS資料段,ES附加段,SS堆疊段,FS以及GS這兩個還是附加段。
其實現在到了Win32環境下,段暫存器以經不如DOS時代那樣重要了。
所以,我們知道就行了。
鋁蘇餉炊啵嘈拍愣CPU以經有了個大概的瞭解了吧。什麼?還是什麼也不明白?呵呵,那也不要灰心,請相信這是我的錯,是我沒有講清楚而已,你可以去參考一些書籍。我始終覺的,你案頭有一本講彙編的書是非常非常有必要的,我這邊兒是清華版的《80x86組合語言程式設計》沈美明主編,46元。
我們接下來就再講一講一些常用的彙編指令吧。(由於考慮到目前以經有了相應的帖子,所以,我只是從彙編指令中,挑出一些最常用,需要掌握的,更多內容,還請參見書本。)
CMP A,B 比較A與B其中A與B可以是暫存器或記憶體地址,也可同時是兩個暫存器,但不能同都是記憶體地址。這個指令太長見了,許多明碼比較的軟體,就用這個指令。
MOV A,B 把B的值送給A其中,A與B可是暫存器或記憶體地址,也可同時是兩個暫存器,但不能同都是記憶體地址。
Xor a,a異或操作,主要是用來將a清空
LEA裝入地址,例如LEA DX,string 將字元的地址裝入DX暫存器
PUSH 壓棧
POP 出棧
ADD 加法指令 格式:ADD DST,SRC 執行的操作:(DST)<-(SRC)+(DST)
SUB 減法指令 格式:SUB DST,SRC 執行的操作:(DST)<-(DST)-(SRC)
MUL 無符號乘法指令 格式: MUL SRC  執行的操作:位元組操作(AX)<-(AL)*(SRC);字操作(DX,AX)<-(AX)*(SRC);雙字操作:(EDX,EAX)<-(EAX)*(SRC)
DIV 無符號除法指令 格式:DIV SRC  執行的操作:位元組操作:16們被除數在AX中,8位除數為源運算元,結果的8位商在AL中,8位餘數在AH中。表示為:
(AL)<-(AX)/(SRC)的商,(AH)<-(AX)/(SRC)的餘數。字操作:32位被除數在DX,AX中。其中DX為高位字,16位除數為源運算元,結果的16位商在AX中,16位餘數在DX中。表示為:(AX)<-(DX,AX)/(SRC)的商,(DX)<-(DX,AX)/(SRC)的餘數。
雙字操作:64位的被除數在EDX,EAX中。其中EDX為高位雙字;32位除數為源運算元,結果的32位商在EAX中,32位餘數在EDX中。表示為:
(EAX)<-(EDX,EAX)/(SRC)的商,(EDX)<-(EDX,EAX)/(SRC)的餘數。
NOP 無作用,可以用來抹去相應的語句,這樣的話,嘿嘿嘿…
CALL呼叫子程式,你可以把它當作高階語言中的過程來理解。
控制轉移指令:
JE 或JZ 若相等則跳
JNE或JNZ 若不相等則跳
JMP 無條件跳
JB 若小於則跳
JA 若大於則跳
JG 若大於則跳
JGE 若大於等於則跳
JL 若小於則跳
JLE 若小於等於則跳
總的來說,以上幾個,都是比較常見的,需要掌握,但需要掌握的絕不止這幾個,其它的指令希望你能在私下裡再瞭解一下,可以找相應的教程來看。
剛才忘了,現在再把
數制轉換也給貼上:
首先說二進位制轉換為十進位制的問題:
各位二進位制數碼乘以與其對應的權之和即為該二進位制相對應的十進位制數。例如:
10100=2的4次方+2的2次方,也就是十進位制數20。
11000=2的4次方+2的3次方,也就是十進位制數24。
接著說一下十進位制數轉換為二進位制數的方法:
這樣的方法到底有多少,我也不清楚,我只講最簡單的一個-除法:
把要轉換的十進位制數的整數部分不斷除以2,並記下餘數,直到商為0為止。
例:N=34D(說明一下,你可能在某些數字的後邊看到過加有一個字母,這個字母便是用來表示數制的,十進位制數用D,二進位制數用B,八進位制數用O,十六進位制數用H)
  34/2=17     (a0=0)
  17/2=8      (a1=1)
  8/2=4       (a2=0)
  4/2=2       (a3=0)
  2/2=1       (a4=0)
  1/2=0       (a5=1)
所以N=34D=100010B。
對於被轉換的十進位制數的小數部分則應不斷乘以2,並記下其整數部分,直到結果的小數部分為0為止。
十六進位制數與二進位制數、十進位制數之間的轉換:
總的來說,十六進位制數與二進數之間的轉換,應該算是很簡單的了,你只需把與之相對應的數值進行轉換就成了。
十六進位制數的基數是16,共有16個數碼,它們是0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F。其中A表示十進位制中的10,其餘類推。它們與二進位制和十進位制數的關係如下:
0H=0D=0000B,1H=1D=0001B,2H=2D=0010B,3H=3D=0011B,4H=4D=0100B,5H=5D=0101B,6H=6D=0110B,7H=7D=0111B,8H=8D=1000B,9H=9D=1001B,AH=10D=1010B,BH=11D=1011B,CH=12D=1100B,DH=13D=1101B,EH=14D=1110B,FH=15D=1111B
所以,二進位制與十六進位制之間要進行轉換的話,只要把它們由低到高每四位組成一級,直接用十六進位制來表示就可以了:
例:   1000      1010      0011       0101
       8         A         3          5
十六進位制轉二進位制則用只需將每一位用四位二進位制數來表示就成了:
例:     A         B         1          0
     1010      1011       0001       0000
最後是十六進位制數與十進位制數之間的互相轉換
十六進位制數轉十進位制數
各位十六進位制數與其對應權值的乘積之和即為與此十六進位制數相對應的十進位制數。
例:N=BF3CH
   =11*16的3次方+15*16的2次方+3*16的1次方+12*16的0次方
   =11*4096+15*256+3*16+12*1
   =48956D
十進位制轉十六進位制
我還是隻講最簡單的除法:
把要轉換的十進位制數的整數值部分不斷除以16,並記下餘數,直到商為0為止。
例N=48956D
   48956/16=3059       (a0=12)
   3059/16=191         (a1=3)
   191/16=11           (a2=15)
   11/16=0             (a3=11)
所以N=48956D=BF3CH。
通過以上的介紹,我不知道你到底看懂沒有,如果有的話,請你去看一下書本,把我沒講到的地方和講過了的地方都仔細地看幾遍。如果你根本就沒有看懂,那麼你就更需要去看書了,不要因為這就喪失掉學習的信心。你認真地把前邊兒的CPU介紹看完,弄清楚暫存器的概念,再把後邊彙編指令拿下,就可以上路了。你認真學,認真背的話,會發現其實並沒你想像中的那麼難。一星期的時間,就可大概掌握了,但只是掌握而已,最起碼可以看懂彙編程式碼了。要真想學好的話,就連後邊兒的也一同看了吧,再寫一些小程式來練練手。當然想精通匯編,那可不是一天兩天一月兩月的事,但你只要有恆心,有什麼搞不定的?CPU也是人做的,指令只是其中的一部分而已,人家能做出CPU,你還怕連使用都學不會?

課後FAQ
Q:我以前學過8086/8088,並且也在DOS下寫過程式,能行嗎?
A:絕對能行,相對8086/8088,現在的CPU在基本指令方面,也沒有新增多少新的指令。你只需瞭解一下各暫存器的變化以及補充一下Windows程式的知識就成了。而且,既然你用匯編在DOS下寫過程式,那麼對Debug等偵錯程式,肯定已經很上手了,所以你有先天的優勢。
Q:彙編對我來說不成問題,可我為什麼總是不上手呢?
A:呵呵,這樣的老鳥倒還有不少,他們把彙編用的相當熟練,但是,只是因為經驗的原因,所以才覺的不上手的,許多人當初不也都這樣嗎?最起碼我就是,見了CALL就跟進,呵呵,倒跟了不少API,所以對於這部分高手,你只需多練練手以及掌握一些分析的技巧就成了。
Q:我沒學過程式設計,能學彙編嗎?
A:總的來說,也行。不過希望彙編的學習,不會使你丟掉學習其它高階語言的信心。:)


答網友問
Q:暫存器可以隨便用麼,有沒有什麼限制?寫個程式的時候那些變數什麼的可以放在任意的暫存器麼?
A:呵呵,我現在就來回答樓上朋友的問題。
暫存器有它的使用機制,及各個暫存器都有著明確的分工。
如小翠兒 第二章--組合語言 如資料暫存器(EAX-EDX),它們都是通用暫存器,及在軟體中,任何資料都可存放於此。但是除此之外,它們又可以都可以用於各自的專用目的。
例如:
EAX可以作為累加器來使用,所以它是算術運算的主要暫存器。在乘除法等指令中指定用來存放運算元。比如在乘法中,你可以用AL或AX或EAX來裝被乘數,而AX或DX:AX或EAX或EDX:EAX則用來裝最後的積。
EBX一般在計算儲存器地址時,它經常用作基址暫存器。
ECX則常用來儲存計數值,如在移位指令它用來裝位移量、迴圈和串處理指令中作隱含的計數器。
最後就剩下四大天王中的黎明瞭,近一段時間來,他總是比較低調...(你別打我了,我去撞牆好了)最後就剩下EDX了,一般在作雙字長運算時把DX和AX組在一起存放一個雙字長數(你還記的什麼是雙字長吧,舉個例子,比如說有一個數二進位制資料01101000110101000100100111010001,你要把它寄存起來,就可以把0110100011010100(即高十六位)放在DX中,把0100100111010001(即低十六位)放在AX中,這個數表示為DX:AX)當然完全可以用一個EDX就把這個數給裝下。所以,還可以用EDX:EAX來裝一個64位資料,這個你會推斷出來吧。
而ESP、EBP、EDI、ESI,我上邊兒以經大概介紹的差不多了,所以這裡不說它們了。
當然還有其它的一些限制,因為我們只是要看程式的彙編程式碼(人家寫好了的,肯定不會犯錯誤吧),而不是要去寫,所以可以不必掌握。有性趣的話,去看相關書籍。
另外再說一下你的最後一個問題“寫個程式的時候那些變數什麼的可以放在任意的暫存器麼? ”這句話我不明白你要問的是什麼。我想你可能是把一些關點給搞錯了,變數這詞通常都是出現在高階語言中的,而你用高階語言寫程式的話,完全不用理解那些暫存器什麼的,這些都跟高階語言沒什麼關係。但是最終,高階語言也還是把你寫的程式轉換為對暫存器、內部儲存器的操作。
<本章完>

相關文章