一、開(kāi)發(fā)環(huán)境
我使用visual studio 2022 preview,其他版本的設(shè)置大同小異。
第一步:
打開(kāi)visual studio,點(diǎn)擊“創(chuàng)建新項(xiàng)目”:
第二步:
visual studio并沒(méi)有專(zhuān)門(mén)的匯編項(xiàng)目,所以需要掛羊頭賣(mài)狗肉,選擇C++空項(xiàng)目
第三步:
輸入項(xiàng)目名稱(chēng),點(diǎn)擊創(chuàng)建
第四步:
鼠標(biāo)右鍵單擊項(xiàng)目名稱(chēng)——>生成依賴項(xiàng)——>生成自定義,點(diǎn)擊masm,這樣才能把masm加入到項(xiàng)目的生成工具中
第五步:
鼠標(biāo)右鍵單擊源文件——>添加——>新建像,選擇C++文件,但文件擴(kuò)展名要改為.asm,編譯器才能自動(dòng)的使用masm編譯
第六步:
因?yàn)?4位匯編比較簡(jiǎn)單,初學(xué)時(shí)把配置改為Release、X64,了解深入后再探索32位匯編
大功告成!
如果用visual studio 2019,可以安裝AsmDude插件,輔助編寫(xiě)匯編代碼。但它目前不支持visual studio 2022
二、匯編語(yǔ)言的基礎(chǔ)知識(shí)
1、哲學(xué)思考
(1)匯編語(yǔ)言的特點(diǎn)
與硬件相關(guān),每一種處理器都有相應(yīng)的匯編語(yǔ)言;
與機(jī)器碼相關(guān),指令通常與機(jī)器碼一一對(duì)應(yīng);
家用電腦使用intel/amd處理器,對(duì)應(yīng)x86-x64匯編語(yǔ)言。
(2)匯編語(yǔ)言的作用
深入理解硬件工作原理;
充分利用計(jì)算機(jī)特性(如SIMD,即單指令多數(shù)據(jù));
開(kāi)發(fā)操作系統(tǒng)內(nèi)核、驅(qū)動(dòng)程序等;
優(yōu)化程序。
(3)匯編語(yǔ)言無(wú)用論
匯編語(yǔ)言代碼難以維護(hù);
編譯器優(yōu)化足夠先進(jìn),無(wú)需匯編語(yǔ)言(編譯器可實(shí)現(xiàn)循環(huán)展開(kāi)、內(nèi)聯(lián)展開(kāi)等,減少跳轉(zhuǎn),而匯編語(yǔ)言開(kāi)發(fā)難以實(shí)現(xiàn));
高級(jí)語(yǔ)言也可以實(shí)現(xiàn)同樣的功能,匯編語(yǔ)言與高級(jí)語(yǔ)言相比并無(wú)優(yōu)勢(shì)。
(4)匯編語(yǔ)言有害論
匯編語(yǔ)言給黑客、病毒、作弊外掛大開(kāi)方便之門(mén)(反駁一:工具價(jià)值中立;反駁二:軟件破解為普通人節(jié)省大量金錢(qián))。
(5)匯編語(yǔ)言也是高級(jí)語(yǔ)言論
在許多CPU中,匯編語(yǔ)言指令并非直接操作硬件,而需通過(guò)硬件制造商提供固件內(nèi)的程序編譯成“微指令”再執(zhí)行,這與高級(jí)語(yǔ)言沒(méi)有說(shuō)很么不同。
2、數(shù)學(xué)基礎(chǔ)
(1)二進(jìn)制、十進(jìn)制、十六進(jìn)制轉(zhuǎn)換和運(yùn)算(可借助windows計(jì)算器)。
(2)浮點(diǎn)數(shù)的存儲(chǔ):
real4:符號(hào)1位+指數(shù)8位+小數(shù)23位(整數(shù)部分1省略);
real8:符號(hào)1位+指數(shù)11位+小數(shù)52位(整數(shù)部分1省略);
real10:符號(hào)1位+指數(shù)15位+小數(shù)64位(整數(shù)部分1省略)。
3、寄存器
匯編語(yǔ)言使用的寄存器實(shí)際上并不是物理寄存器,而是在通過(guò)一定的操作映射CPU內(nèi)部特定的物理寄存器。主要包括:
(1)通用寄存器16個(gè),可以通過(guò)通常的指令讀寫(xiě):
全部64位 | 0-31位 | 0-15位 | 8-15位 | 0-7位 |
---|---|---|---|---|
rax | eax | ax | ah | al |
rbx | ebx | bx | bh | bl |
rcx | ecx | cx | ch | cl |
rdx | edx | dx | dh | dl |
rsi | esi | si | sil | |
rdi | edi | di | dil | |
rbp | ebp | bp | bpl | |
rsp | esp | sp | spl | |
r8 | r8d | r8w | r8b | |
r9 | r9d | r9w | r9b | |
r10 | r10d | r10w | r10b | |
r11 | r11d | r11w | r11b | |
r12 | r12d | r12w | r12b | |
r13 | r13d | r13w | r13b | |
r14 | r14d | r14w | r14b | |
r15 | r15d | r15w | r15b |
以上16個(gè)寄存器,esp專(zhuān)門(mén)用于指示棧頂;此外,其他其他寄存器也有一定的功能區(qū)別,在某些指令中作為默認(rèn)操作數(shù),但這些功能區(qū)別正日益消失。
(2)專(zhuān)用寄存器有專(zhuān)門(mén)用途,并且只能通過(guò)專(zhuān)門(mén)的指令讀寫(xiě):
用途 | 全部64位 | 0-31位 |
---|---|---|
標(biāo)志寄存器 | rflags | eflags |
指令寄存器 | rip |
標(biāo)志寄存器各位含義:
位 | 名稱(chēng) | 數(shù)值含義 | 主要用途 |
---|---|---|---|
0 | CF | 1進(jìn)位,0無(wú)進(jìn)位 | 無(wú)符號(hào)數(shù)運(yùn)算是否溢出 |
1 | 置1 | ||
2 | PF | 1偶數(shù),0奇數(shù) | 過(guò)去主要用于數(shù)據(jù)傳輸校驗(yàn),目前很少用 |
3 | 置0 | ||
4 | AF | 1半進(jìn)位,0無(wú)半進(jìn)位 | 過(guò)去主要用于BCD碼加減法,因BCD碼指令已廢除,目前很少用 |
5 | 置0 | ||
6 | ZF | 1結(jié)果零,0結(jié)果非零 | 是否相等 |
7 | SF | 1負(fù)數(shù),0正數(shù) | 是否大于或小于 |
8 | TF | 1引發(fā)int 1中斷,0不引發(fā)中斷 | 用于調(diào)試,用戶態(tài)置0,不可更改 |
9 | IF | 1允許中斷,0不允許中斷 | 用于暫時(shí)屏蔽中斷,用戶態(tài)置1,不可更改 |
10 | DF | 1遞增,0遞減 | 確定字符串指令的執(zhí)行方向,通常置0 |
11 | OF | 1溢出,0無(wú)溢出 | 有符號(hào)數(shù)運(yùn)算是否溢出 |
12-13 | IOPL | 0-3,表示IN/OUT指令操作需要的特權(quán)級(jí) | 操作系統(tǒng)通常置0,即用戶態(tài)不能使用IN/OUT指令 |
14 | NT | 表示當(dāng)前任務(wù)與其他任務(wù)是否關(guān)聯(lián) | 由操作系統(tǒng)管理 |
15 | 置0 | ||
16 | RF | 確定調(diào)試異常的處理方式 | 由操作系統(tǒng)管理 |
17 | VM | 表示是否處于虛擬8086模式 | 由操作系統(tǒng)管理 |
18 | AC | 表示是否進(jìn)行內(nèi)存對(duì)齊檢查 | 由操作系統(tǒng)管理 |
19 | VIF | 虛擬中斷標(biāo)志 | 由操作系統(tǒng)管理 |
20 | VIP | 虛擬中斷掛起 | 由操作系統(tǒng)管理 |
21 | ID | 表示是否允許執(zhí)行CPUID指令 | 由操作系統(tǒng)管理 |
22-63 | 置0 |
不涉及系統(tǒng)編程時(shí),通常只需要注意CF、AF、SF、OF四個(gè)標(biāo)志位,并將其用于有條件跳轉(zhuǎn)指令。
需注意的是,Visual Studio 2019、2022的調(diào)試模式下,寄存器窗口的EFLAGS第1位按照0來(lái)顯示,但將EFLAGS存入堆棧后可以看出EFLAGS第1位仍然是1。Visual Studio 2017及更早版本的寄存器窗口則顯示為1。
(3)其他寄存器:
與浮點(diǎn)數(shù)或SIMD指令集相關(guān),在學(xué)習(xí)相應(yīng)的指令集時(shí)再學(xué)習(xí)。
4、操作數(shù)(又稱(chēng)“尋址模式”)
(1)立即數(shù)
包括8位、16位、32位、64位立即數(shù)。
在masm中不能指定立即數(shù)類(lèi)型,而是由編譯器根據(jù)情況確定。如果需要指定立即數(shù)類(lèi)型,只能直接書(shū)寫(xiě)機(jī)器碼(對(duì)比:nasm可以指定)。
除mov指令外,絕大多數(shù)指令不允許使用64位立即數(shù)。要對(duì)64位數(shù)值進(jìn)行操作,通常需要用mov指令先傳入某個(gè)寄存器,再指定寄存器位操作數(shù)。
(2)寄存器
包括8位、16位、32位、64位寄存器,通過(guò)寄存器名稱(chēng)指定。
intel匪夷所思的重要規(guī)則:對(duì)通用寄存器低32位操作會(huì)導(dǎo)致高32位清零,對(duì)通用寄存器的低16位、低8位、8-15位操作均不影響其他位。
(3)內(nèi)存
內(nèi)存數(shù)據(jù)可以是8位、16位、32位、64位或128位。
內(nèi)存地址的指定方式包括:
第一,rip+偏移量,通過(guò)變量名指定內(nèi)存時(shí),編譯器自動(dòng)轉(zhuǎn)換到這種方式
第二,通用寄存器,如[rdx]
第三,通用寄存器+偏移量,如[rdx+0531h]
第四,比例索引字節(jié)(SIB),即[存放基址的寄存器+存放索引號(hào)的寄存器*比例]
第五,比例索引字節(jié)(SIB)+偏移量,即[存放基址的寄存器+存放索引號(hào)的寄存器*比例+偏移量];
第六,64位數(shù)直接指定內(nèi)存地址(僅MOV指令支持)。
其中:
比例索引字節(jié)的比例可以是1、2、4或8;
偏移量只能是8位或32位,intel不支持64位偏移量。
需要特別指定內(nèi)存的數(shù)據(jù)長(zhǎng)度時(shí),可以添加“數(shù)據(jù)類(lèi)型 ptr”前綴。
5、數(shù)據(jù)
(1)數(shù)據(jù)類(lèi)型
字節(jié)數(shù) | 無(wú)符號(hào)整型 | 有符號(hào)整型 | 浮點(diǎn)型 |
---|---|---|---|
1 | db, byte | ||
2 | dw, word | sword | |
4 | dd, dword | sdword | real4 |
6 | df, fword | ||
8 | dq, qword | real8 | |
10 | dt, tbyte | real10 |
SIMD指令使用的數(shù)據(jù)類(lèi)型,在SIMD部分再學(xué)習(xí)。
在匯編語(yǔ)言中,有符號(hào)整型和無(wú)符號(hào)整型實(shí)際上沒(méi)有區(qū)別,且均可以用來(lái)表示浮點(diǎn)數(shù),因此下列代碼含義完全相同:
acon dd 6.7
acon sdword 6.7
acon real4 6.7
但是,浮點(diǎn)型卻不能用來(lái)表示整數(shù),因此,下列代碼無(wú)法通過(guò)編譯:
mydata real8 35
如此修改則可以通過(guò)編譯:
mydata real8 35.0
(2)結(jié)構(gòu)體
結(jié)構(gòu)體類(lèi)型名 struct
內(nèi)容
結(jié)構(gòu)體類(lèi)型名 ends
(3)常量
十進(jìn)制數(shù),直接書(shū)寫(xiě),或以d/t結(jié)尾,如:
358
4.1
二進(jìn)制數(shù),用b結(jié)尾,如:
01011100b
八進(jìn)制數(shù),用o/q結(jié)尾,如:
401o
十六進(jìn)制數(shù),用h結(jié)尾,如果以字母開(kāi)頭,則前面加0,如:
0ah
45h
浮點(diǎn)數(shù)可以用小數(shù)或者科學(xué)計(jì)數(shù)法表示,如:
4.1
4.32398E4;(即43239.8)
浮點(diǎn)數(shù)只能用在數(shù)據(jù)初始化部分,不能用在指令中;在指令中使用浮點(diǎn)數(shù),應(yīng)轉(zhuǎn)換為浮點(diǎn)編碼。此外,MASM不支持某些教材上介紹的r后綴表示的“編碼實(shí)數(shù)”類(lèi)型。
字符和字符串常量:
以單引號(hào)或雙引號(hào)表示,MASM不區(qū)分單引號(hào)和雙引號(hào),但單引號(hào)和雙引號(hào)仍需分別配對(duì),不能混用。引號(hào)內(nèi)一個(gè)字符則為字符,多個(gè)字符則為字符串。單引號(hào)字符串中可以包含雙引號(hào),雙引號(hào)字符串可以包含單引號(hào)。如果字符串內(nèi)單引號(hào)、雙引號(hào)混用,則需要分開(kāi)寫(xiě),并以逗號(hào)分割,如:
'Hello from Luisa'
"XP"
"No. It isn't"
'app "windows"'
'app "windows"?', "No. It isn't"
為字符串。須以數(shù)值表示。
MASM只能用引號(hào)定義ansi字符串,如果需要定義unicode字符串,須逐字符書(shū)寫(xiě),例如:
dw 'H', 'e', 'l', 'l', 'o', 0;unicode字符串"Hello\0"
masm32論壇可以找到他人編寫(xiě)的unicode字符串宏,以簡(jiǎn)化unicode字符串書(shū)寫(xiě)。
整型常量表達(dá)式:
整型常量之間可以用+-*/MOD以及括號(hào)運(yùn)算符進(jìn)行計(jì)算,計(jì)算過(guò)程由編譯器進(jìn)行。
符號(hào)常量:
=:可以表示包含符號(hào)常量的常量表達(dá)式,但只能表示整數(shù),并且可以在程序中反復(fù)修改,例如:
.data
P EQU 3
count=5
d1 dw count dup(0)
count=10*2
d2 dw count dup(0)
count=10*P
d3 dw count dup(0)
EQU:可以表示包含符號(hào)常量的常量表達(dá)式,例如:
count=5
PI EQU 3.1416
PP EQU count+2
MY_NAME EQU "Luisa Amalia Ho"
d1 qword PP*PP; d1=49
EQU后面的常量表達(dá)式如果加尖括號(hào),表示將括號(hào)內(nèi)的文本原樣復(fù)制,數(shù)值可能存在差異,例如
count=5
PI EQU <3.1416>
PP EQU <count+2>
MY_NAME EQU <"Luisa Amalia Ho">
d1 qword PP*PP; d1=17
(3)標(biāo)識(shí)符
常量名、變量名、標(biāo)號(hào)、過(guò)程名等自定義的名稱(chēng),均為標(biāo)識(shí)符。
MASM的標(biāo)識(shí)符由1-247個(gè)字符組成,不區(qū)分大小寫(xiě),只能使用字母、數(shù)字、下劃線、@、?、$,且數(shù)字不能作為標(biāo)識(shí)符開(kāi)頭。
標(biāo)識(shí)符不得與MASM保留字相同。
三、第一個(gè)匯編語(yǔ)言程序
如上所述,visual studio并沒(méi)有專(zhuān)門(mén)的匯編語(yǔ)言項(xiàng)目,我們是以掛羊頭賣(mài)狗肉的方式,借助C++項(xiàng)目的名義書(shū)寫(xiě)匯編語(yǔ)言程序。在這樣的項(xiàng)目下,要想讓匯編語(yǔ)言程序運(yùn)行,有幾種選擇:
第一種選擇是,在項(xiàng)目的屬性中指定入口點(diǎn),此時(shí),windows系統(tǒng)將直接按照入口點(diǎn),調(diào)用你書(shū)寫(xiě)的匯編語(yǔ)言過(guò)程,該過(guò)程結(jié)束后,程序結(jié)束,返回windows系統(tǒng)。程序只會(huì)執(zhí)行你書(shū)寫(xiě)匯編語(yǔ)言代碼,不會(huì)執(zhí)行其他的東西。但是即便是初學(xué)者,大家也希望書(shū)寫(xiě)一個(gè)能夠通過(guò)輸入輸出實(shí)現(xiàn)某種功能的程序,而不是僅僅在調(diào)試窗口里觀察寄存器和內(nèi)存的數(shù)值變化。雖然此時(shí)我們也可以通過(guò)調(diào)用windows api實(shí)現(xiàn)輸入輸出,但實(shí)現(xiàn)過(guò)程比較復(fù)雜,對(duì)于初學(xué)者并不合適。
第二種選擇是,我們既然以掛羊頭賣(mài)狗肉的方式,假借C++的名義,創(chuàng)建了項(xiàng)目,那么我們可以創(chuàng)建C++文件,由C++的main函數(shù)調(diào)用我們書(shū)寫(xiě)的匯編代碼。然而,這種C/C++和匯編的混合編程,本應(yīng)在了解C/C++和匯編語(yǔ)言之后才能學(xué)習(xí)。對(duì)于匯編語(yǔ)言的初學(xué)者也不合適。
第三種選擇是,我們既然以掛羊頭賣(mài)狗肉的方式,假借C++的名義,創(chuàng)建了項(xiàng)目,那么我們就仿照C++的方式,假裝自己是C++程序,創(chuàng)建main過(guò)程讓項(xiàng)目執(zhí)行。然后,我們可以像其他學(xué)習(xí)C/C++的人一樣,直接調(diào)用C/C++庫(kù)函數(shù)實(shí)現(xiàn)輸入輸出的目的。
按照上文方式創(chuàng)建的項(xiàng)目,在沒(méi)有指定入口函數(shù)的情況下,visual studio會(huì)指定mainCRTStartup為入口,接下來(lái)才會(huì)調(diào)用main。因此,直接生成必然是會(huì)產(chǎn)生找不到mainCRTStartup的鏈接錯(cuò)誤;如果你在visual studio項(xiàng)目中創(chuàng)建一個(gè)空的,c/.cpp文件,那么vs就會(huì)正確的加載相應(yīng)的庫(kù)函數(shù),進(jìn)而調(diào)用你用匯編寫(xiě)成的main過(guò)程。不過(guò),僅僅這么做,如果你調(diào)用printf,鏈接器依然無(wú)法找不到C/C++庫(kù)函數(shù)。
此時(shí),簡(jiǎn)單易行的做法應(yīng)該是通過(guò)INCLUDELIB,把C/C++庫(kù)文件包含在匯編代碼內(nèi),即:
INCLUDELIB libcmt
加入這一個(gè)庫(kù)文件,就不需要另外創(chuàng)建.c/.cpp空文件。vs會(huì)把你的代碼當(dāng)作C++項(xiàng)目,正確的編譯、鏈接,并且以main作為入口點(diǎn)執(zhí)行。
因此,第一個(gè)匯編語(yǔ)言程序,露易莎在這里向各位問(wèn)好了:
INCLUDELIB libcmt;包含“C運(yùn)行時(shí)庫(kù)”
EXTERN printf:PROC;聲明函數(shù)printf
.data;數(shù)據(jù)段
output_format db "Hello from Luisa",0;需要打印的字符串
.code;代碼段
main PROC;main過(guò)程開(kāi)始
sub rsp, 28h;預(yù)留空間
lea rcx, output_format;傳入output_format的地址作為參數(shù)
call printf;調(diào)用printf
add rsp, 28h;平衡堆棧
ret;從過(guò)程返回
main ENDP;main過(guò)程結(jié)束
END;匯編代碼結(jié)束
1、MASM64匯編語(yǔ)言源代碼文件的書(shū)寫(xiě)特點(diǎn)
(1)不區(qū)分大小寫(xiě);
(2)注釋以分號(hào)開(kāi)始;
(3)換行通常作為語(yǔ)句結(jié)束標(biāo)志,如一個(gè)語(yǔ)句過(guò)長(zhǎng),內(nèi)部需要換行,可以在行尾用'\'表示。
2、內(nèi)容
(1)聲明部分
include包含*.inc文件;
includelib包含*lib庫(kù)文件;
EXTERN聲明外部函數(shù)和變量;
(2)段
在64位匯編中,采用平坦模式,不涉及段。但MASM在程序結(jié)構(gòu)上仍然保留了段的概念。在運(yùn)行時(shí),不同的段會(huì)被分配到不同的頁(yè)面。
64位匯編通常以簡(jiǎn)易的方式聲明段,包括:
.data(可讀,可寫(xiě),不可執(zhí)行,段名_DATA),本段數(shù)據(jù)可以初始化,如未初始化,則編譯器自動(dòng)填入0,這些數(shù)據(jù)會(huì)存入.exe文件中
.data?(可讀,可寫(xiě),不可執(zhí)行,段名_BSS),本段數(shù)據(jù)不進(jìn)行初始化,也不會(huì)存入.exe,在運(yùn)行時(shí)才分配內(nèi)存,并全部填入0。該段中的數(shù)據(jù)若進(jìn)行初始化,編譯不會(huì)報(bào)錯(cuò),但運(yùn)行時(shí)仍然填入0。
.code(可讀,不可寫(xiě),可執(zhí)行,段名_TEXT),本段為代碼段,但在代碼之中也可以包括數(shù)據(jù),如數(shù)據(jù)未初始化,則編譯器自動(dòng)填入0,這些數(shù)據(jù)會(huì)存入.exe文件中
.const(可讀,不可寫(xiě),不可執(zhí)行,段名CONST),本段數(shù)據(jù)可以初始化,如未初始化,則編譯器自動(dòng)填入0,這些數(shù)據(jù)會(huì)存入.exe文件中
64位匯編不能自己定義堆棧段。堆棧段由操作系統(tǒng)提供,堆棧段大小可以在項(xiàng)目屬性中設(shè)置。
違反段的權(quán)限規(guī)定,會(huì)報(bào)異常。
完整方式聲明段的方式是:
段名 segment [read|write|execute]
段名 ends
同名的段可以多次定義,但權(quán)限不得改變,鏈接器將把同名的段鏈接在一起。
通常僅在需要運(yùn)行時(shí)修改代碼等有特殊用途的情況下,才會(huì)用完整方式聲明段
(3)變量定義
變量定義格式為[變量名] 類(lèi)型 初始化數(shù)值;未初始化的數(shù)值用?表示。
dup偽指令表示重復(fù)同樣數(shù)值或?,例如:mydata db 300 dup(0),表示定義300個(gè)db類(lèi)型的0,每個(gè)占用1字節(jié)。
定義大型數(shù)組(例如500k以上),無(wú)論是否初始化,masm64編譯都會(huì)顯著變慢,這是一個(gè)長(zhǎng)久的bug,原因不明(GoAsm等其他編譯器不存在此類(lèi)問(wèn)題)。
一種替代方法使用org偽指令指定下一個(gè)數(shù)據(jù)的地址,之前的內(nèi)存會(huì)全部置0且可以讀寫(xiě)。
例如定義會(huì)導(dǎo)致編譯極慢:
array db 500000 dup(?)
可以考慮改為
org 0
array db ?
org 500000
db ?; 這一行必須有,否則操作系統(tǒng)不會(huì)分配這部分內(nèi)存
此時(shí)地址0~500000均可正常讀寫(xiě)。
(4)文件結(jié)束
END是匯編代碼文件結(jié)束的標(biāo)志。END之后無(wú)論寫(xiě)什么,編譯器一律忽略。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-450403.html
因此,這樣的代碼也是可以編譯運(yùn)行的:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-450403.html
INCLUDELIB libcmt;包含“C運(yùn)行時(shí)庫(kù)”
EXTERN printf:PROC;聲明函數(shù)printf
.data;數(shù)據(jù)段
output_format db "Hello from Luisa",0;需要打印的字符串
.code;代碼段
main PROC;main過(guò)程開(kāi)始
sub rsp, 28h;預(yù)留空間
lea rcx, output_format;傳入output_format的地址作為參數(shù)
call printf;調(diào)用printf
add rsp, 28h;平衡堆棧
ret;從過(guò)程返回
main ENDP;main過(guò)程結(jié)束
END;匯編代碼結(jié)束
Nichts hier ist für immer
Auch wenn es so scheint
Pl?tzlich wachst Du auf
Und bist allein
Die Stra?en sind noch grau
Es ist wie jedes Jahr
Die Uhr sie bleibt nicht stehen
Du bist allein
Eben noch
Warst Du ein Teil der sch?nen Welt
Der Unendlichkeit
Gerade noch
Warst Du ein Stück der Ewigkeit
Schon Vergangenheit
Es ist vorbei
Es ist vorbei
Es ist vorbei
Wieder stehst Du auf
Und schaust zum Fenster raus
Alles ist noch so
Wies früher war
Der Tag lacht viel zu laut
Und will in Dein Gesicht
Du ziehst den Vorhang zu
Und Du bleibst da
Eben noch
Warst Du ein Teil der sch?nen Welt
Der Unendlichkeit
Gerade noch
Warst Du ein Stück der Ewigkeit
Schon Vergangenheit
Es ist vorbei
Es ist vorbei
Es ist vorbei
Eben noch
Warst Du ein Teil der sch?nen Welt
Der Unendlichkeit
Gerade noch
Warst Du ein Stück der Ewigkeit
Schon Vergangenheit
Es ist vorbei
Es ist vorbei
Es ist vorbei
Es ist vorbei
Es ist vorbei
Es ist vorbei
到了這里,關(guān)于匯編語(yǔ)言筆記(一)——匯編語(yǔ)言基礎(chǔ)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!