計算機組成原理(10)----微程序控制器

目錄

1.微程序控制器的設計思想

2.微指令的基本格式

3.微程序控制器的基本結構

(1)控制存儲器CM

(2)CMAR

(3)地址譯碼

(4)CMDR

(5)微地址形成部件

(6)順序邏輯

4.微程序控制器的工作原理

5.微指令具體格式的設計

(1)水平型微指令

(2)垂直型微指令

(3)混合型微指令

6.微指令的編碼方式

(1)直接編碼(直接控制)方式

(2)字段直接編碼方式

(3)字段間接編碼方式(了解即可)

7.微指令的地址形成方式

8.微程序控制單元的設計

(1)分析每個階段的微操作序列

(2)寫出對應機器指令的微操作命令及節拍安排

(3)確定微指令的格式

(4)編寫微指令碼點

9.微程序設計的分類(了解)

(1)靜態微程序設計

(2)動態微程序設計

(3)毫微程序設計

10.硬布線與微程序的比較


上一小節講了硬布線控制器,這一小節來看微程序控制器:

紅框部分是重點,需要深入理解與學習

1.微程序控制器的設計思想

高級語言程序是由一條條指令構成的,而一條指令又是由微操作序列組成,所以用微操作序列實現指令的功能十分類似于用指令序列實現程序的功能。

我們可以用同樣的思想,將一個時鐘周期內可以進行的微操作,用一個微指令指明

一個個微指令序列就構成了微程序,每一種指令對應一個微程序

指令與微指令:

指令是對程序執行步驟的描述

微指令是對指令執行步驟的描述

微命令,微操作,微指令和微程序:

微命令與微操作一 一對應

微指令中可能包含多個微命令

微程序由一系列微指令組成

一條機器指令對應一條微程序

主存儲器與控制器存儲器(CM):

主存儲器用來存放機器指令

控制器存儲器(CM)用來存放微指令序列,被集成在控制單元內部,并且由ROM實現,通常在CPU出廠時就把所有微程序寫入這個ROM芯片中。

指令周期與微周期(微指令周期):

指令周期:從主存取出并執行一條機器指令所需的時間
微周期(微指令周期):從控制器存儲器取出一條微指令并執行相應微操作所需的時間

微程序控制器的設計思想就是采用“存儲程序”的思想,CPU出廠前將所有指令的“微程序”存入“控制器存儲器”中

2.微指令的基本格式

如下圖所示,一條微指令需要操作控制字段,用來表示這條微指令所對應的微操作是哪幾個,而順序控制字段則用來指明下一條微指令的地址。

3.微程序控制器的基本結構

(1)控制存儲器CM

用于存放各指令對應的微程序,每條指令的微程序都是順序存放的。這些微程序在CPU出廠前,廠商就應該編寫完成。

控制存儲器可用只讀存儲器ROM(因為ROM讀取速度更快,并且ROM是非易失性的存儲芯片,也就是CPU斷電后,控制存儲器CM的數據是不會丟失的)構成。

(2)CMAR

CPU想要讀取內存中某一個數據時,需要從PC中將需要讀取的數據的地址放到MAR中,再根據MAR從主存中讀取相應地址的數據,微程序控制器中的CMAR同理。

CMAR,也稱為uPC ,微地址寄存器,接收微地址形成部件送來的微地址,為在CM中讀取微指令作準備。相當于PC-->MAR的結合。

(3)地址譯碼

MAR的地址信息,需要通過譯碼器處理,才能在主存儲器找到相應地址的數據。在微程序控制器中,也需要通過地址譯碼將地址碼轉化為存儲單元控制信號。

(4)CMDR

在主存中找到相應數據后,需要存儲到MDR。在微程序控制器中,需要CMDR,也稱uIR,用于存放從CM中取出的微指令,它的位數同微指令字長相等。

(5)微地址形成部件

產生初始微地址和后繼微地址,以保證微指令的連續執行。每一條指令對應的微程序不同,因此需要根據指令的操作碼,確定其對應的微程序的起始地址是什么

(6)順序邏輯

用于控制微指令序列的執行次序。

4.微程序控制器的工作原理

所以執行指令的過程如下:

當CPU接收到一條指令后,會把指令的操作碼傳送到微指令形成部件,用來確定該指令對應的微程序的起始地址是什么,接下來再根據順序邏輯的標志等信息,確定下一條微指令的存放地址,將這一地址放到CMAR中,經過地址譯碼器的譯碼后,就可以在控制存儲器CM中選中對應地址的微指令,將這一微指令放到CMDR中。

微指令包含兩個信息,第一部分信息用于描述這條微指令對應的控制信號,第二部分信息用于描述下一條需要執行的微指令的地址,也稱為下地址。

執行完這條微指令后,需要將下地址信息送給順序邏輯,順序邏輯通過標志等信息,將下一條微指令的地址送到CMAR中。

對于微指令的控制部分,微指令通過這一控制部分,向CPU內部和系統總線發出控制信號。

所有指令的取指周期、間址周期、中斷周期所對應的微指令序列都一樣,那么是否可以共享使用?

在控制存儲器CM中,取指周期、間址周期、中斷周期所對應的微指令序列都只有一份,對于執行周期對應的微程序,每一條指令都是不同的

注:取指周期的微指令序列固定從#0開始存放。執行周期的微指令序列的存放根據指令操作碼確定。

例如:對于LDA X,就是將X地址所指的數據從主存中取到ACC中

取指周期:#0,#1,#2

0號微指令對應的多個微操作:

(PC)--->MAR,1--->R

1號微指令對應的微操作:

M(MAR)--->MDR

1號微指令對應的微操作:

(MDR)--->IR

下一條微指令的地址被存放在下地址為3的位置,也就是間址周期的第一條微指令

但是LDA X這條指令不一定需要執行間址周期,那么如何跳過間址周期呢?

順序邏輯需要根據指令地址碼的尋址特征位判斷是否要跳過間址周期,如下圖所示,這條微指令送到順序邏輯的下地址信息為3。經過順序邏輯的處理后,若這條指令不需要執行間址周期,就會直接跳到這條指令對應的執行周期的微指令序列。

根據該指令的操作碼,通過微地址形成部件的處理后,微地址形成部件會告訴順序邏輯這條指令對應的執行周期微指令的起始地址是13,順序邏輯就會將13這個地址信息放到CMAR中,也就表明了接下來要執行的是13這條微指令。

那么執行完下地址為3的微指令后,緊接著就會執行下地址為13的微指令。

所以指令的執行不是一成不變的,處理判斷是否有間址周期外,還需判斷是否有中斷周期

需要注意以下幾點:

1.取指周期的微程序段通常是公用的,故如果某指令系統中有n條機器指令,則CM中微程序段的個數至少是n+1個。

因為每條指令對應執行周期的微程序不同,所以需要設置n個微程序分別表示n個執行周期微程序,另外再在上1個取指周期微程序即可,因為取指周期微程序對于每條指令都是相同的。

注:間址周期微程序和中斷周期微程序對于每條指令都是相同的,為什么不算上他們?

一些早期的CPU、物聯網設備的CPU可以不提供間接尋址和中斷功能,因此這類CPU可以不包含間址周期、中斷周期的微程序段。

2.物理上,取指周期、執行周期看起來像是兩個微程序,但邏輯上,應該把它們看作一個整體。因此,一條指令對應一個微程序的說法是正確的。

5.微指令具體格式的設計

先了解兩個概念:相容性微命令以及互斥性微命令

相容性微命令:可以并行完成的微命令。互斥性微命令:不允許廷行完成的微命令。

(1)水平型微指令

一條微指令能定義多個可并行的微命令

(2)垂直型微指令

一條微指令只能定義一個微命令,由微操作碼字段規定具體功能:

微操作碼較短,例如8bit的微操作碼,就能指明2^8=256種微操作。

若某微程序想完成某些固定的微操作,并采用水平型微指令,那么微指令數較少,但是每條微指令較長。

水平型微指令的優點:微程序短,執行速度快。

水平型微指令的缺點:編寫微程序較麻煩。

若某微程序想完成某些固定的微操作,并采用垂直型微指令,就需要更多條的微指令,因為每個微指令對應一個微操作。

垂直型微指令的優點:微指令短,簡單,規整,便于編寫微程序。

垂直型微指令的缺點:微程序長,執行速度慢,工作效率低。

(3)混合型微指令

在垂直型的基礎上增加一些不太復雜的并行操作。微指令較短,仍便于編寫;微程序也不長,執行速度加快。

6.微指令的編碼方式

微指令的編碼方式又稱為微指令的控制方式,它是指如何對微指令的控制字段進行編碼,以形成控制信號。編碼的目標是在保證速度的情況下,盡量縮短微指令字長。這里主要探討水平型微指令:

(1)直接編碼(直接控制)方式

在微指令的操作控制字段中,每一位代表一個微操作命令

某位為“1”表示該控制信號有效,例如下圖,若想讓此微指令的"(PC)--->MAR","1--->R"兩個微操作有效,只需讓兩個微操作對應的控制信號置為1即可。

優點:簡單、直觀,執行速度快,操作并行性好。
缺點:微指令字長過長,n個微命令就要求微指令的操作字段有n位,造成控存容量極大。

(2)字段直接編碼方式

將微指令控制字段分成若干"段",每段經譯碼后發出控制信號,微命令字段分段的原則:

① 互斥性微命令分在同一段內,相容性微命令分在不同段內。

② 每個小段中包含的信息位不能太多,否則將增加譯碼線路的復雜和譯碼時間。

一般每個小段還要留出一個狀態,表示本字段不發出任何微命令。因此,當某字段的長度為3位(2^3=8)時,最多只能表示7(8-1)個互斥的微命令,通常用000表示不操作。

例如,"(PC)--->MAR"與"1--->R"這兩個微操作是可以并行執行的,所以需要把這兩個微操作分到不同段中,這兩個微操作在不同的段中會有對應的編碼,編碼經過譯碼器譯碼后,就會發出相應的控制信號,并且這兩個控制信號是并行發出的

而(PC)--->MAR與(PC)+1--->PC是互斥的微操作,所以把這兩個微操作放到同一個段中,兩個微操作在段中的編碼不同,依次經過譯碼器譯碼。

這樣微指令的字長就能有效減短。

例題:

某計算機的控制器采用微程序控制方式,微指令中的操作控制字段采用字段直接編碼法共有33個微命令,構成5個互斥類,分別包含7、3、12、5和6個微命令,則操作控制字段至少有多少位?

第1個互斥類有個7微個命令,要留出1個狀態表示不操作,所以需要表示8種不同的狀態,故需要3個二進制位。以此類推,后面4個互斥類各需要表示4、13、6、7種不同的狀態,分別對應2、4、3、3個二進制位。

故操作控制字段的總位數為:
3+2+4+3+3=15 位

若采用直接編碼方式,則控制字段需要33位,所以采用字段直接編碼法,字長有效減短了

優點:可以縮短微指令字長。
缺點:要通過譯碼電路后再發出微命令,因此比直接編碼方式慢。

(3)字段間接編碼方式(了解即可)

一個字段的某些微命令需由另一個字段中的某些微命令來解釋,由于不是靠字段直接譯碼發出的微命令,故稱為字段間接編碼,又稱隱式編碼。

優點:可進一步縮短微指令字長。

缺點:削弱了微指令的并行控制能力,故通常作為字段直接編碼方式的一種輔助手段

7.微指令的地址形成方式

(1)直接根據微指令的下地址字段指出

微指令格式中設置一個下地址字段,由微指令的下地址字段直接指出后繼微指令的地址,這種方式又稱為斷定方式

(2)根據機器指令的操作碼形成

當機器指令取至指令寄存器后,微指令的地址操作碼經過微地址形成部件形成。

(3)增量計數器法

若想要順序執行一系列的微指令序列,只需要在當前微指令執行結束后,將(CMAR)+1---->CMAR即可。用這種方式順序找到下一條應該執行的微指令。

(4)分支轉移

對于轉移類的微指令,會指明轉移方式(指明判別條件)以及轉移地址(指明轉移成功后的去向)

這條微指令也會直接改變下一條微指令的地址。

(5)通過測試網絡

這個測試網絡就是順序邏輯,順序邏輯會接收某些標志信息,根據標志信息以及微指令的某些bit信息,決定下一條微指令的地址

(6)由硬件產生微程序入口地址

?第一條微指令地址由專門 硬件 產生

每條指令的取指周期對應的微指令序列是公用的,從#0號地址開始存放,所以任何指令的第一條微指令地址一定是#0號地址,那么這一固定的地址就可以用專門的硬件記錄(用專門的硬件記錄取指周期微程序首地址

?中斷周期 由硬件 產生 中斷周期微程序首地址

若某條指令的執行需要進入中斷周期,也會用專門的硬件來記錄中斷周期微程序首地址,因為所有指令在中斷周期對應的微指令序列是相同的。

例題:

某計算機采用微程序控制器,共有32條指令,公共的取指令微程序包含2條微指令,各指令對應的微程序平均由4條微指令組成,采用斷定法(下地址字段法)確定下條微指令地址,則微指令中下地址字段的位數至少是多少位?

解讀:

公共的取指令周期的微指令有2條,每個指令對應的執行周期的微指令有4條

至少多少位,則忽略間址周期中斷周期

?解答:

32*4+2=130條

每條指令的執行周期執行的微指令不同,總共32條指令,平均每個指令執行周期執行的微指令為4條,故32*4

取指周期屬于公共部分,所以32*4+2

所以下地址字段的位數至少需要安排8位bit位(2^8=256>130條)

注:對于下一條微指令地址的形成方式,最常考的為斷定法計數器法

8.微程序控制單元的設計

設計的步驟如下:

1.分析每個階段的微操作序列

2.寫出對應機器指令的微操作命令及節拍安排

3確定微指令格式

4.編寫微指令碼點

可以發現1,2條與硬布線控制器類似

(1)分析每個階段的微操作序列

微程序控制器的節拍安排與硬布線控制器的節拍安排極其類似,只有最后一步不同:

對于硬布線控制器:OP(IR)--->ID,是將指令的操作碼傳送到指令譯碼器ID,而指令譯碼器會選通與操作碼對應的選通信號。

對于微程序控制器:OP(IR)--->微地址形成部件,是將指令的操作碼傳送給微地址形成部件,由微地址形成部件指明這條微指令在執行周期對應的微程序段的起始地址。

對于微程序控制器,相容的微操作可以安排在同一個微指令內,使其并行地完成

注:這里需要區分微指令編碼方式中的字段直接編碼方式字段直接編碼方式是將微指令的操作控制字段分為多個段,相容的微操作放在不同的段內,并行發出控制信號。這是在單條微指令內討論的。

而這里的相容的微操作可以安排在同一個微指令內,是相對多條微指令而言的。

如下圖所示,取指階段先執行微指令a,再執行微指令b...即可。

那么如何讀出 這3條微指令,以及如何轉入下一個機器周期呢?

對于取指周期的第一條微指令的存放地址,由硬件自動給出。而微指令b的地址由微指令a的下地址表示。

如圖所示,當前微指令發出相應的控制信號后,還需要將下地址存放到CMAR中

Ad(CMDR)--->CMAR,占用一個節拍(時鐘周期)

所以每執行完一條微指令后,都需要用一個節拍執行Ad(CMDR)--->CMAR這一操作,指明下一條微指令的存放地址。

那么如何轉入下一個機器周期?

取指周期的節拍安排如下:

假設取指周期過后就是執行周期,因為各個指令在執行周期的微指令不同,所以在取指階段的微指令執行結束后,需要根據當前執行指令的操作碼,確定執行周期的微指令起始地址。

OP(IR)--->微地址形成部件,將微指令的操作碼傳給微地址形成部件后,還需要消耗一個節拍,將微地址形成部件的地址信息傳到CMAR,即微地址形成部件--->CMAR。

所以微程序控制器在取指周期的節拍安排如下:

如下安排也可以,只要保證同一節拍內的微操作可以并行運行即可:

微程序控制器完成取指周期需要5個節拍,而硬布線控制器只需要3個節拍。

顯然,微程序控制器的速度比硬布線控制器更慢。

(2)寫出對應機器指令的微操作命令及節拍安排

?寫出每個周期所需要的微操作(參照硬布線)

?補充微程序控制器特有的微操作:

a.取指周期:

每條微指令結束之后都需要進行:

Ad(CMDR)--->CMAR,根據當前執行的微指令的下地址信息,確定下一條微指令的存放地址。

取指周期的最后一條微指令完成后,要根據指令操作碼確定其執行周期的微程序首地址:

OP(IR)--->微地址形成部件--->CMAR

b.執行周期:

每條微指令結束之后,需要通過當前執行的微指令指明下一條微指令的地址。
Ad(CMDR)--->CMAR

若執行周期結束,執行周期最后一條微指令的下地址就會指向下條指令取指周期的第一條微指令的存放地址。

(3)確定微指令的格式

微指令包含操作控制字段以及順序控制字段。

根據微操作個數決定采用何種編碼方式(直接編碼,字段直接編碼,字段間接編碼),以確定微指令的操作控制字段的位數。

根據CM中存儲的微指令總數,確定微指令的順序控制字段的位數。

最后按操作控制字段位數和順序控制字段位數就可確定微指令字長。

(4)編寫微指令碼點

根據操作控制字段每一位代表的微操作命令,編寫每一條微指令的碼點。例如,對于直接編碼方式:若想讓此微指令的"(PC)--->MAR","1--->R"兩個微操作有效,只需讓兩個微操作對應的控制信號置為1即可。

接下來將微指令序列存放入CM即可。

9.微程序設計的分類(了解)

(1)靜態微程序設計

微程序無需改變,采用ROM

(2)動態微程序設計

通過改變微指令和微程序改變機器指令(即拓展新的機器指令或優化現有的機器指令),有利于仿真,采用EPROM(可擦除芯片)

(3)毫微程序設計

微程序設計?用 微程序解釋機器指令

毫微程序設計 用 毫微程序解釋微程序

毫微指令與微指令的關系好比微指令與機器指令的關系。

10.硬布線與微程序的比較

對于微程序控制器,若想添加新指令,則只需根據現有的微指令來描述想添加的新指令即可。而對于硬布線控制器而言,若想添加新指令,需要重新設計組合邏輯電路。

所以硬布線適合RISC(精簡指令集系統),這個系統中所支持的機器指令條數較少,并且相對固定,所以采用硬布線的方式可以提高指令的執行速度。

微程序適合于CISC(復雜指令集系統),例如X86架構,因為復雜指令集系統所支持的機器指令很多,并且機器指令時常需要擴充,所以采用微程序控制器可以使CPU的成本更低,但是每一條機器指令的執行速度可能更慢。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/696904.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/696904.shtml
英文地址,請注明出處:http://en.pswp.cn/news/696904.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

31.云原生Istio可觀測性之官網Bookinfo應用實戰演示

云原生專欄大綱 文章目錄 可觀測性kiali介紹Overview(概觀)Application(應用維度)workloads(負載維度)Services(服務維度)Istio Config(配置維度) Kiali部署…

音頻聲波的主觀感受

一、響度 聲壓是“客觀”的,響度是“主觀”的。 響度又稱音量。人耳感受到的聲音強弱,它是人對聲音大小的一個主觀感覺量。響度的大小決定于聲音接收處的波幅,就同一聲源來說,波幅傳播的愈遠,響度愈小…

React18原理: React核心對象之Update、UpdateQueue、Hook、Task對象

Update 與 UpdateQueue 對象 1 ) 概述 在fiber對象中有一個屬性 fiber.updateQueue是一個鏈式隊列(即使用鏈表實現的隊列存儲結構)是和頁面更新有關的 2 )Update對象相關的數據結構 // https://github.com/facebook/react/blob/v18.2.0/pa…

【Nginx】Nginx配置反向代理 和 https

nginx.conf配置 進入linux /etc/nginx/ 打開nginx.conf 進行以下配置 http {include mime.types;default_type application/octet-stream;sendfile on;keepalive_timeout 65;server {#監聽443端口listen 443 ssl;#你的域名server_name huiblog.top;#ssl證書的pe…

VSCode The preLaunchTask ‘C/C++: clang++ 生成活動文件‘ terminated with exit code -1

更改tasks.json文件里面的type為shell 選擇g 選擇g,然后點回到text.c,按下F5. 得到結果。 文中內容參考: 從零開始手把手教你配置屬于你的VS Code_嗶哩嗶哩_bilibili https://blog.csdn.net/qq_63872647/article/details/128006861

【EasyV】QGIS轉換至EasyV

QGIS轉換至EasyV 第一步:導入QGIS第二步 坐標系轉換第三步 集合修正第四步 重命名字段第五步 導出WGS geojson坐標第六步 導入EasyV 第一步:導入QGIS 第二步 坐標系轉換 第三步 集合修正 第四步 重命名字段 第五步 導出WGS geojson坐標 第六步 導入EasyV…

【es6】模版字面量/模版字符串,標簽函數/String.raw()靜態方法

模版字符串經常用,但是這個標簽函數的功能你肯定不知道,請看官網文檔 看完你需要知道 可以自定義標簽函數String.raw 的用法 唯一一個內置的模版字符串標簽函數第一個參數具有 raw 屬性的對象,值時一個類數組字符串對象模版字面量的緩存機制…

【vue vue-seamless-scroll】解決vue-seamless-scroll鼠標懸浮才滾動或者只滾動一次就失效的問題

解決問題:使用vue-seamless-scroll發現只有鼠標懸浮上去才滾動,而且滾動一次停止了 目標效果: 解決方案: 最后發現是因為數據需要在頁面掛載好就賦值,否則頁面在加載完成后,數據無法自動滾動。但因為數據…

c++:藍橋杯的基礎算法2(構造,模擬)+練習鞏固

目錄 構造 構造的基礎概念: 模擬 練習1:掃雷 練習2:灌溉 練習3:回文日期 構造 構造的基礎概念: 構造算法是一種用于解決特定問題的算法設計方法。在C語言中,構造算法通常涉及到創建一個函數或類來實…

ARM服務器上部署zookeeper集群

由于ARM服務器上部署zookeeper集群,會存在加載不到主類問題,現在把遇到的問題進行總結下,問題如下: [rootnode206 apache-zookeeper-3.5.10]# bin/zkServer.sh start ZooKeeper JMX enabled by default Using config: /data1/software/apache-zookeeper-3.5.10/bin/../conf/…

四、Burpsuite工具之proxy模塊詳解-intercept功能

前言: 過了一個年,感覺好久都沒有更新了,今天就從burpsuite的更新開始吧。 前面已經說過了burpsuite的安裝和proxy代理的配置,今天說一下proxy模塊中非常有用的intercept功能。 intercept功能介紹: intercept是攔截…

Spring之AOP源碼解析(中)

前言 在上一篇文章中,我們講解了Spring中那些注解可能會產生AOP動態代理,我們通過源碼發現,完成AOP相關操作都和ProxyFactory這個類有密切關系,這一篇我們將圍繞這個類繼續解析 演示 作用 ProxyFactory采用策略模式生成動態代理對象,具體生成cglib動態代理還是jdk動態代理,…

算法提升——LeetCode第385場周賽總結

題目 統計前后綴下標對 I 給你一個下標從0開始的字符串數組words。 定義一個布爾函數isPrefixAndSuffix,它接受兩個字符串參數str1和str2: 當str1同時是str2的前綴(prefix)和后綴(suffix)時&#xff0c…

APP的UI自動化demo(appium+java)

文章目錄 appium連接手機java代碼實現-第一版第二版-接入testng和隱式等待顯示等待 appium連接手機 準備工作 1、查看連接手機模擬器是否連接成功,獲取設備名稱 執行命令:adb devices 2、查看android內核版本號—>paltformVersion 執行命令&#xf…

MQL語言實現單元測試

文章目錄 一、單元測試是什么二、單元測試的過程三、為什么需要單元測試四、MQL測試代碼實現 一、單元測試是什么 單元測試是對軟件中最小可測單元(如類或函數)進行獨立驗證和檢查的過程。它是由開發工程師完成的,旨在確保每個單元的功能和邏…

Postman接口關聯實戰解析

在使用postman做接口測試時,有時候后面的接口需要獲取前面接口的某一個返回值做為請求參數,這時就可以使用關聯。 如從A接口提取出a字段的值,供B接口的b字段使用。 一個接口的返回報文如下: {"retCode": "0&quo…

SwiftUI 集合視圖(Grid)拖放交換 Cell 的極簡實現

概覽 自從 SwiftUI 橫空出世那天起,小伙伴們都感受到了它驚人的簡單與便捷。而在本課中,我們將會用一個小“栗子”更直觀的讓大家體驗到它無與倫比簡潔的描述性特質: 如上圖所示,我們在 SwiftUI 中實現了 Grid 中拖放交換 Cell 的…

基于SpringBoot + Layui的社區物業管理系統

項目介紹 社區物業管理系統是基于java編程語言,springboot框架,idea工具,mysql數據庫進行開發,本系統分為業主和管理員兩個角色,業主可以登陸系統,查看車位費用信息,查看物業費用信息&#xff0…

2個wordpress優化SEO主題模板

SEO優化wordpress主題 簡潔的SEO優化wordpress主題,效果好不好,結果會告訴你,適合SEO公司使用的主題。 https://www.jianzhanpress.com/?p2804 SEO優化海外WordPress主題 簡潔的SEO優化海外服務商WordPress主題,為中國制造202…