Skip to main content

4 posts tagged with "教學"

View All Tags

大戰系統程式 - 控制段組譯與連結載入

· 9 min read

前面我們講了基本的組譯流程,而這篇主要要講的是怎麼樣合併兩個程式,因為通常我們寫完的程式碼不會只有一份檔案,而是會有數份。

這裡的細節爆炸多,所以一定要仔細看。第一步的組譯過程和之前一樣,我會把不一樣的地方寫出來,其它相同的地方不會再重複。

下方的內容如果有錯誤,歡迎來信更正!

組譯

下方的題目取自席家年教授的練習題,如有侵權請來信告知!

題目 PDF 下載

下方為練習卷 練習卷

可以發現到有兩份程式碼需要組譯,而且兩份程式碼裡面都出現了之前沒有出現的字。第一個步驟就是先把位址寫一寫,這裡位址和之前一樣。

第一份程式:

地址標記符號指令運算元
0000TSTPGMSTART0
EXTDEFREF4
EXTREFNXTREF
...
0029REF1LDX#ENDA-TSTA
002CREF2LDATSTA,X
002FREF3+LDSNXTREF-24
0033REF4EQU*
...
0050TSTAEDU*
...
0084ENDAEDU*
0084REF5WORDTSTA+8
0087RESB12
0093ENDREF1

上面這張表格跟之前的其實沒有什麼差別,但可以發現到有兩個比較特別的是 EXTDEF 和 EXTREF,這兩個就是外部引用的程式。

還有一個東西是 EDU,後面的運算元是一個 *,而這個我們就當成保留,不佔用空間。

第二份程式碼發現到地址幫我們上好,但我一樣寫在下面。

地址標記符號指令運算元
0000NXTPGMSTART0
EXTDEFNXTREF
...
0052NXTREFLDANXTREF+20
0055NXT1LDB#NXTREF
...
0090NXT2WORDNXT2-6
0093RESW5
00A2END

接下來就是把目地的碼算出來,過程跟之前都一樣。

第一份程式碼:

地址標記符號指令運算元目地碼
0000TSTPGMSTART0
EXTDEFREF4
EXTREFNXTREF
...
0029REF1LDX#ENDA-TSTA050034
002CREF2LDATSTA,X03A021
002FREF3+LDSNXTREF-246F1FFFF8
0033REF4EQU*
...
0050TSTAEDU*
...
0084ENDAEDU*
0084REF5WORDTSTA+8000058
0087RESB12
0093ENDREF1

第二份程式碼:

地址標記符號指令運算元目地碼
0000NXTPGMSTART0
EXTDEFNXTREF
...
0052NXTREFLDANXTREF+20032011
0055NXT1LDB#NXTREF692FFA
...
0090NXT2WORDNXT2-600008A
0093RESW5
00A2END

目的程式

跟之前一樣會有兩份目的程式,但這裡跟之前不太一樣,差別在於有 EXTREF 和 EXTDEF,這兩個都會生成比較特別的紀錄。

第一份

先從第一份程式碼開始,一樣的先從表頭紀錄開始

H,TSTPGM,000000,000093

接下來我們會有兩種新的紀錄,分別是 D 紀錄和 R 紀錄,D 紀錄在代表的是自己給別人用的程式,而 R 紀錄正好相反,代表的是自己使用別人的程式。

先寫 D 紀錄,要依序寫入的資訊如下:

  • 開頭字母 D
  • 六格的標紀符號,對應到 EXTDEF 後面所寫的標紀錄號
  • 六格的標紀符號所在位址

D,REF4☐☐,000033

再來寫 R 紀錄,和 D 紀錄相同,要依序寫入的資訊如下:

  • 開頭字母 R
  • 六格的標紀符號,對應到 EXTREF 後面所寫的標紀符號

R,NXTREF

接下來的本文紀錄和之前相同,下面不再重複。

T,000029,0A,050034,03A021,6F1FFFE8

T,000084,03,000058

再來是修正紀錄基本上和之前一樣,但是有一個紀錄不太一樣。

注意到標紀位址在 REF3 那一行,可以發現到計算的時候使用到了 NXTREF 這個標紀符號,仔細看就會發現到這個使用到了 EXTREF 所標紀的符號,所以修正紀錄也要基於 NXTREF,而不是 START 的 TSTPGM,換句話說就是這裡是基於外部的程式。

M,000030,05,+NXTREF

還有一行需要修正的是 REF5,這行的話沒有什麼特別的,修正紀錄如下:

M,000084,06,+TSTPGM

最後的結束紀錄和之前一樣,沒什麼特別的

E,000029

第二份

表頭紀錄如下:

H,NXTPGM,000000,0000A2

D 紀錄如下:

D,NXTREF,000052

本文紀錄如下:

T,000052,06,032011,692FFA

T,000090,03,00008A

修正紀錄一個,如下:

M,000090,06,+NXTPGM

結束紀錄就一個 E

連結載入

接下來就是要模擬在電腦中實際載入兩份程式碼之後會發生的事,假設載入的起始位址的 5000。

而外部符號表要處理的地方比較多,控制段其實就是程式的外稱,像 TSTPGM 指的就是第一份程式碼。符號名稱就是 EXTDEF 後面寫的標紀符號,位址的話就是 START 的位址跟 END 的位址,長度就是兩者相減。

第二份程式碼跟第一份的步驟相同,但是位址要接在第一份之後。

控制段符號名稱位址長度
TSTPGMREF45000~509393
NXTPGMNXTREF5093~50E5A8

實際上執行的時候修正紀錄就會發揮作用,下面舉幾個例子,也就是練習卷的題目。

REF3 +LDS NXTREF-24 載入到記憶體的位址為 502F,修正後的目的碼為 6F1050CD

目的碼的算法就是看修正紀錄怎麼寫就怎麼做,像這題的修正紀錄是 M,000030,05,+NXTREF,所以我們要做的就是把 1FFFF8 拿出來加上 NXTREF,而 NXTREF 的值為 50E5,可以對應到剛剛的外部符號表。

REF5 WORD TST+8 載入到記憶體的位址為 5084,修正後的目的碼為 005058

NXT1 LDB #NXTREF 載入到記憶體的位址為 50E8

而最後,程式開始的地方就是第一條本文記錄開始的地方,需要注意一下要再加上初始地址,得到 5029

大戰系統程式 - SIC/XE 指令分析

· 10 min read

系統程式這門課應該是所有資工系必修的課,這門課連我自己都覺得有點硬,我會這麼說是因為網路上的資料真的不多,而且連 GenAI 也常常給出錯的答案。因此我決定寫個筆記,給我自己也給未來的大二生看。

如果你不知道這門課在學什麼,簡單來說就是跟組合語言有關的東西,像編譯、組譯、連結等等,而這些都有非常多的細節,理解後非常有趣。

下方的內容如果有錯誤,歡迎來信更正!

基礎指令分析

下方的題目取自席家年教授的練習題,如有侵權請來信告知!

題目 PDF 下載

針對每條指令我們要處理的問題如下:

  • 助憶碼
  • 指令格式
  • Target Address
  • 被改變的目標
  • 內容值

分析最重要的就是這張資料表,放在這方便對照:

分析所需的資料表

9080

第一題我們來分析最簡單的指令,雖然說是最簡單的但是如果其它題目熟悉之後,反而常常會忘掉這種指令要怎麼解。

先拆成二進位,我們可以從得到 1001 0000 1000 0000。我們馬上可以發現到長度是 16 位元,再看到上方提供的資料可以知道是格式二。

按照我提供的資料表可以發現到前六碼是運算碼,接著四碼是 r1 再接著四碼是 r2。

前六碼為 1001 00,需要注意如果只有六個位元,則我們要補到八個位元,補完後為 1001 0000,可以得到十六進位的 90。然後再看到 SIC/XE 部分指令那邊,使用 opcode 去對,就可以得到 ADDR r1, r2 這個助憶碼。

而 r1 和 r2 分別是多少呢?把 r1 換成十進位得到 8,r2 得到 0,有了這兩個之後再去剛剛的部分指令表下方的暫存器區,使用編號去對應就可以知道 r1 是 PC,而 r2 是 A。

現在我們可以來回答問題了:

  • 助憶碼就是上方的 ADDR r1, r2
  • 指令格式是 2
  • 被改變的目標可以在 SIC/XE 部分指令表的 Effect 發現是 r2,也就是 A
  • 內容值就是把 r1 跟 r2 加在一起,也就是 12345A + 003000,可以得到 12645A

032600

同樣的先換成二進位 0000 0011 0010 0110 0000 0000,得到長度是 24,而 24 對應到的格式有兩種,可能是 SIC 或格式三。

那我們要怎麼知道是哪一種?我們可以直接去看第七跟第八個位元,如果是 00 則是 SIC 指令,而這裡是 11,因此確定是格式三。

確定了之後就看著表格,取出前六位分析,得到十六進位的 00,助憶碼就是 LDA m

這題可以發現到在運算碼之後還有一個六位元的 nixbpe,而這裡就是最麻煩的地方,在看的時候要分成 ni 和 xbp 去看,而 e 我們先不管它,這個只有在組譯的時候會用到,這篇用不到。

ni 有三種可能,分別如下:

  • 10 indirect 間接定址
  • 11 direct 直接定址
  • 01 immediate 立即定址

這裡是 11,可以知道是直接定址。

xbp 和我們最後計算出來的 Target Address(TA)有關,算法如下

  • 假設 x 為 1,則我們就先把 X 暫存器的值記起來
  • b 和 x 做法相同
  • p 和 x 的做法也相同,但這裡的 P 指的是 PC 暫存器

現在我們先把 PC 的值計起來,得到 003000

接著還有一位 e,那個直接不理它跳過就好。

現在和上題一樣,把剩下的 12 位元轉換成十六進位得到 600,再把 600003000 加起來就是 TA。

而我們還有一個內容值要看,這裡和定址模式有關:

  • 間接定址代表我們要在記憶體 dereference 兩次,換句話說就是我們要先用位址去找到值,再拿值當位址找一次。
  • 直接定址代表我們直接去位址找值
  • 立即定址代表算出來的 TA 就是值,不用找

現在我們可以來回答問題了:

  • 助憶碼就是上方的 LDA m
  • 指令格式是 3
  • TA 為 003600
  • 定址模式為直接定址
  • 被改變的目標是 A,可以參考 SIC/XE 部分指令表
  • 內容值可以在 003600 這格記憶體找到,答案為 103000

03C300

接下來的題目除非有比較特別的地方,不然都跟前面那題的解法相同。

這題和上題比較不同的是 xbp 的地方,可以發現到是 110,因此我們可以知道要把 x 和 b 的值加起來,之後再拿後 12 位換成十六進位之後加上去,TA 可以得到 6390

答案:

  • 助憶碼 LDA m
  • 指令格式是 3
  • TA 為 6390
  • 定址模式為直接定址
  • 被改變的目標是 A
  • 內容值可以在 6390 這格記憶體找到,答案為 C303

022030

ni 可以發現到是 10,可以發現到是間接定址。

內容值要拿兩次,TA 在計算過後可以得到 3030,先看一次 3030 的值為 003600,之後再對位址看一次得到內容值 103000

答案:

  • 助憶碼 LDA m
  • 指令格式是 3
  • TA 為 3030
  • 定址模式為間接定址
  • 被改變的目標是 A
  • 內容值為 103000

010030

ni 可以發現到是 01,發現到是立即定址。

內容值就是 TA,也就是 30

答案:

  • 助憶碼 LDA m
  • 指令格式是 3
  • TA 為 30
  • 定址模式為立即定址
  • 被改變的目標是 A
  • 內容值為 30

003600

這題可以發現到 ni 是 00,也就是說這題是一種 SIC 指令。

如果 x 為 1 則稱為索引定址,但這張練習卷沒有這種模式,處理方法就是 TA 要再加上 X 暫存器的值。而像這題的 X 為 0,就直接當成前面講過的直接定址即可。

答案:

  • 助憶碼 LDA m
  • 指令格式是 SIC
  • TA 為 3600
  • 定址模式為直接定址
  • 被改變的目標是 A
  • 內容值為 103000

0310C303

這題換成二進位之後發現到長度有 32 碼,是格式四的指令。

答案:

  • 助憶碼 LDA m
  • 指令格式是 4
  • TA 為 C303
  • 定址模式為直接定址
  • 被改變的目標是 A
  • 內容值為 003030

012FFE

這題可以發現到最後的 12 位是 1111 1111 1110,需要注意如果開頭是 1,像這題的情況就需要做負數處理。

做法是先把這個數字做一次二的補數,之後再把數字加上負號,其於的步驟都相同,只是最後的 12 位位址是負的。

這題的 TA 計算為 3000 + (-2),得到 2FFE

答案:

  • 助憶碼 LDA m
  • 指令格式是 3
  • TA 為 2FFE
  • 定址模式為立即定址
  • 被改變的目標是 A
  • 內容值為 2FFE

6BC300

這題其實如果有照我前面的指示應該不會有問題,但是最一開始的助憶碼要記得補兩個零,不然就會發現到找不到指令。

前六碼是 0110 10,如果你直接換成十六進位會發現找不到指令,因為要補零變成 0110 1000 得到 68,對應到的助憶碼為 LDB m

答案:

  • 助憶碼 LDB m
  • 指令格式是 3
  • TA 為 6390
  • 定址模式為直接
  • 被改變的目標是 B
  • 內容值為 C303

大戰系統程式 - SIC 及 SIC/XE 組譯

· 14 min read

繼上一篇指令分析,這篇要做的是組譯,組譯指的是我們寫完的組合語言變成機器語言的過程。

和之前的指令分析一樣,有非常多的細節要注意。這裡的練習分寫 SIC 和 SIC/XE,有些地方不同且 SIC/XE 還有多東西要處理。

下方的內容如果有錯誤,歡迎來信更正!

SIC 組譯

下方的題目取自席家年教授的練習題,如有侵權請來信告知!

題目 PDF 下載

下方為練習卷 練習卷

而我們要做的第一件事就是幫每條指令寫上位址,有些指令會發現沒有在 SIC 指令表內,而這些不在表內的指令稱為組譯指示,也就是說是寫給組譯看的,並不會實際產生程式碼,但這不代表不會佔用位址空間。

位址標記符號指令運算元
2100EX2START2100
2100TSTLDAONE
2103STADATA
2106LDXONE
2109LDCHSTR,X
210CSTCHCX
210FRSUB
2112DATARESW1
2115ONEWORD1
2118STRBYTEC'01'
211ACXRESB1
ENDTST

上方這張表多了位址這個欄位,而欄位的計算重點如下:

  • 位址開始從 START 指令的運算元開始
  • START 後的第一條指令的位址和 START 相同,因為 START 不會佔用位址空間
  • 位址是使用 byte 做為計數,而 SIC 表內的每條指令都佔用 24 個 bit,也就是 3 個 byte,因此可以發現到表內指令的位址皆為 +3
  • 所有的運算元皆使用十進位,除了 START 之外
  • RESW 代表此處保留指定數量的 word,一個 word 代表三個 byte
  • WORD 代表此處要有一個長度為 word 的整數,運算元即為整數的值
  • RESB 代表此處保留指定數量的 byte
  • BYTE 的運算元 C'01' 的 01 代表的是字元,因此此處可以知道有兩個字元,也就是兩 byte

算出所有的位址之後就下以完成「標記符號位址表(SYMTAB)」這個表格

標記符號位址
EX22100
TST2100
DATA2112
ONE2115
STR2118
CX211A

接著我們要開始寫目的程式,但在寫之前要先把在 SIC 表內的指令轉成目的碼,其實就是把我前一篇指令分析的步驟倒過來。

標註指令運算元位址目的碼
EX2START21002100
TSTLDAONE2100002115
STADATA21030C2112
LDXONE2106042115
LDCHSTR,X210950A118
STCHCX210C54211A
RSUB210F4C0000
DATARESW12112
ONEWORD12115000001
STRBYTEC'01'21183031
CXRESB1211A
ENDTST211B

上方這張表多了目的碼這個欄位,而欄位的計算重點如下:

  • 指令可以透過 SIC 指令表取得對應的 opcode,而 opcode 就是前八位二進位
  • 如果運算元有 ,X 表示要使用索引定址,則我們把二進位的第九位設為 1
  • 其於的 15 位則可以參考標記符號位址表填入
  • BYTE 直接把字元換成 ASCII 再換成十六進制寫入
  • WORD 直接寫入運算元換成十六進制的值即可,但要記得保留前面的 0,總共要有六位。

下面以 LDCH STR,X 這條指令為例:

我們取得 LDCH 的 opcode 為 50,二進位為 0101 0000,這代表前八位。因為有 ,x,因此要使用索引定址,我們把第九位設為 1,反之為 0

最後把剩下的 STR 的位址 2118 轉為二進位,得到 010 0001 0001 1000,可以發現到第一組只有三位,因為只有 15 位。

接著把所有的二進位組合起來 0101 0000 1 010 0001 0001 1000,再換回十六進位就可以得到 50A118

目的程式

接下來真的可以開始寫目的程式了,目的程式要一行一行的寫,且所有的地方都以十六進位表示。這邊特別提一下,正常的程式不會有 ,,這裡是為了清楚顯示才加的。

第一行是表頭紀錄,要依序寫入的資訊如下:

  • 開頭字母 H
  • 六格的程式名稱,如果不足則直接補空格
  • 六格的開始位址,如果不足則直接補零
  • 六格的程式長度,如果不足則直接補零

以這份程式為例,表頭紀錄如下:

H,EX2☐☐☐,002100,00001B

值得注意的是程式長度的算法就是 END 位址減掉 START 的位址

接下來會有數行的本文紀錄,要依序寫入的資訊如下:

  • 開頭字母 T
  • 六格的開始位址,如果不足則直接補零
  • 兩格的程式長度,如果不足則直接補零。這個可以最後再寫
  • 從上到下的目的地,連續往後寫不加空格,直到遇到指令沒有目的碼,則直接重新開始一行

以這份的程式為例,可以寫出兩行如下: T,002100,12,002115,0C2112,042115,50A118,54211A,4C0000 T,002115,05,000001,3031

最後一行是結束紀錄,但是這裡因為剛好遇到有指令沒有目的碼,因此可以直接不寫 END。

這裡就完成了 SIC 的指令組譯了。

SIC/XE 組譯

大部分的步驟都和 SIC 組譯相同,我會特別針對不同的地方點出來,相同的地方我不會再提。

題目 PDF 下載

下方為練習卷 SIC/XE 組譯練習卷

和 SIC 大部分相同,先把位址寫一寫,寫完的結果如下:

位址標記符號指令運算元
0START0
0BBLDB#BB
-BASEBB
3LDAKK
6+STANN
AKKWORD15
DBUFRESB4096
100DLDA@NN
1010STABUF,X
1013NNRESW1
1016ENDBB

特別注意到 +STA,這個代表的是它佔了四個 byte,因此計算的時候要 +4。

接著我們就直接寫目的碼,寫完如下:

位址標記符號指令運算元目的碼
0TESTSTART0
0BBLDB#BB692FFD
-BASEBB
3LDAKK032004
6+STANN0F101013
AKKWORD1500000F
DBUFRESB4096
100DLDA@NN022003
1010STABUF,X0FC00D
1013NNRESW1
1016ENDBB

在開始之前請確保已經學會了指令分析,因為很多東西我不會再提。這裡我會選幾條需要講解的來做,其它的做完可以參考上方。

LDB #BB

同樣的先找到 LDB 的 opcode 68,之後就可以發現到運算元前面有個 # 的符號,這和 ni 有關,可以參考下方的整理:

  • 無符號 11
  • # 01
  • @ 10

因此這裡可以知道 ni 要是 01

而我們還有 xbp 要決定,決定的方法如下:

  • x 只有運算元指定的時候才使用
  • b 參考 p
  • p 只要是運算元是標記符號就使用,但需要注意如果 TA 會超出範圍 2048PC2047-2048 \leq PC \leq 2047,則換成 b。
  • 如果是格式四則全為 0

最後還有一個 e,這個的決定就是運算子前面有沒有 + 號,如果有的話就會變成格式四。

但到這裡我們只決定了 nixbpe,我們還有最後的 12 位要算。還記得之前做指令分析的時候會把最後 12 位加上 xbp 之類的暫存器的位址嗎?這裡我們要反算,我們要讓算出來的值剛好落在我們想要的地方。

這裡我們的目標是 BB,也就是 0 這個位址,而 PC 此時是多少呢?PC 指的是下一行的位址,在這裡是 3,因此我們就知道這 12 byte 要是 -3,這樣一來才能跟 PC 做抵銷,來到達我們想要的地。注意一下 -3 要使用二的補數來表達。

而這樣我們就全部都有了,我們就能寫出 0110 1001 0010 1111 1111 1101,換成十六進位就是 692FFD

+STA NN

這條可以發現到前面有 + 號,因此要使用格式四的方式來寫,也就是說會有 32 位,寫出來的目的碼也會明顯比較長。

除此之外,xbp 都應該要是 0

LDA @NN

這條沒有什麼特別的,但可以發現到運算元前面有 @,也就是說 ni 要是 10

STA BUF,X

這條可以發現到有一個 ,X,可以知道 xbp 的 x 要設為 1。除此之外還會發現到後 12 位算完會超出範圍,這個時候就要把 p 改為 0 且把 b 改為 1

這個時候的後 12 位就不是在使用 PC 去做計算,而是要使用 BASE 所在的位址,也就是 0

因為剛好是零,因此後 12 位就剛好是 BUF 的位址。

目的程式

當寫完全部的目的碼之後就可以開始寫目的程式,第一行的表頭紀錄和 SIC 一樣,如下:

H,TEST☐☐,000000,001016

接下來一樣會有數行的本文紀錄,跟之前完全一樣,如下:

T,000000,0D,692FFD,032004,0F101013,00000F

T,00100D,06,022003,0FC00D

再接下來會有一個跟 SIC 不同的地方,稱為修正紀錄。為什麼會需要這個紀錄是因為有時候我們使用的定址是直接寫死的,也就是說不是用 PC 之類的方法算出來的,而是直接寫死某個地方,但程式會被放在記憶體的哪裡我們不知道,因此寫死的位址就會在運作的時候出錯。

以這題為例,可以發現到 +STA NN 的 xbp 都是 0,也就是說它的位址寫死了,因此它就需要修正。

每一個需要修正的指令都要一行修正紀錄,內容依序寫入:

  • 開頭字母 M
  • 六格要修正的指令後 20 位或後 12 位所在的位址
  • 兩格要修正的位數,位數要再除於四
  • 符號 +
  • 六格 START 位址的標記符號

以這份的程式為例,修正紀錄如下:

M,000007,05,+,TSET☐☐

這裡的長度其實只會有兩種可能,如果是格式三就一定是 3,如果是格式四就一定是 5。

結束紀錄如下,就填上 BB 代表的位址即可:

E,000000

還在用網頁下載 Youtube 影片嗎?

· 7 min read

下載工具的最後大魔王

我從國小開始,三不五時就會有從 Youtube 下載影片的需求,我認為這種需求應該是每個人從小到大,甚至到出社會都會需要用到的技能。最常見的方法就是去網路上找「Youtube 影片下載器」之類的網站,這些網頁常常每次找的都不一樣,可能這次可以用,下次就失效了。我們需要一個可以穩定長期使用的工具,那就是 yt-dlp。

yt-dlp 是一套開源工具,完完全全免費,可以選擇的選項還非常多,要下載什麼格式都行,但是安裝上比較麻煩一點點,我覺得這個可能是它不那麼流行的原因,但如果你像我一樣會使用終端機,或者你常常要下載音樂或影片,那這個工具你一定不能錯過。

萬事起頭難

  1. 先下載兩個程式。你一定會有疑問為什麼要下載兩個而不是一個?其實這也非常好理解,因為 yt-dlp 是用來下載,而 FFmpeg 是用來處理格式的問題,兩者都是開源的。FFmpeg 本身是一個非常強大,也是各大播放器的核心元件之一。

  2. 兩者都下載之後就到你的下載資料夾,先把 ffmpeg 那個 .zip 解開,之後應該會長得像下面這樣。

    • ffmpeg 解壓縮之後和 yt-dlp 的示意圖
  3. 之後點開剛剛解壓縮的 ffmpeg 資料夾,一路點進裡面的 bin 資料夾,之後把 yt-dlp.exe 拉進去。

    • 在 bin 資料夾內包含了 yt-dlp.exe 示意圖
  4. 接著把整個 ffmpeg 資料夾拉到 C:\ 底下

    • 被拉進 C 槽底下的 ffmpeg 資料夾
  5. 到設定的環境變數裡面設定變數。範例的作業系統為 Windows 10,其它系統大同小異,再請讀者自行上網搜尋步驟。路徑為「控制台」->「系統」->「關於」->「進階系統設定」->「環境變數」。如果圖片太小,可以點擊右鍵並選擇「在新分頁中開啟圖片」,這樣會比較清楚。

設定系統關於進階系統設定環境變數
設定系統關於進階系統設定環境變數
  1. 雙擊位於上方的 Path,之後會進入編輯區,此時,到你剛剛複製到 C 槽的 ffmpeg 資料夾,和之前一樣點進 bin 資料夾內。接著,點擊上方的路徑欄將路徑複製下來。接著回到編輯區,點擊「新增」把剛剛複製的路徑貼上,之後點擊「確定」就行了。

    • Path
    • C 槽內的 ffmpeg 資料夾
    • 編輯區內新增
  2. 你已經安裝完成了,接下來要測試是否成功。做法很簡單,就是開啟 CMD,就是那個最讓你害怕的小黑窗。接著就可以測試了,分別輸入 yt-dlpffmpeg 應該要看到和下方圖片類似的回覆。

    • 於開始查詢 cmd
    • yt-dlp 正確回覆
    • ffmpeg 正確回覆
  3. 如果正確的話就安裝完成了喔!

開始使用

在你想要下載的資料夾,點上方的路徑欄,輸入 cmd 就可以開始使用。 cmd 輸入在路徑欄的示意圖

所有的操作都會在 CMD 裡面執行,但是也不要感到害怕,這一點也不難。你可以先試著輸入下方的範例指令,看看運行的結果。

yt-dlp -f mp4 https://youtu.be/dQw4w9WgXcQ

如果執行沒有發現什麼錯誤,那麼你已經成功下載了一部影片了,趕快去你的資料夾看看吧!

等等,我不就要記一堆指令?

這個問題問得非常的好!以前確實需要記住一部分,而且常常要去看官方的手冊,用想的就知道非常麻煩,但都 2025 年了,誰還在這樣?我們可以直接使用任何你覺得習慣的生成式 AI,只要像下面這樣,就馬上得到了一條可以用的指令。

於生成式 AI 生成指令的示意圖

你成功學會使用了

如果你能成功下載影片,那你就得到了一項強而有力的武器。有了這個之後就再也不用依賴一堆奇怪的網站來幫你了,而且你也學會了怎麼使用終端機工具,其實都是很類似的操作,一開始可能會覺得不習慣,但這真的不難。