微型计算机原理王忠民PPT,微型计算机原理4 王忠民著.ppt
微型計算機原理4 王忠民著.ppt
2021年2月8日 1,西安郵電學院計算機系 系統結構教研室 2009.8,微機原理與匯編語言,教材及參考書 微型計算機原理王忠民 王鈺 王曉婕 編著 微型計算機原理學習與實驗指導 王鈺 王勁松 刑高峰 編著,2021年2月8日 2,第4章 80 x86指令系統,主要內容 80868088指令格式 80868088指令系統的尋址方式 80868088指令系統 80 x8Pentium指令系統,2021年2月8日 3,1.1 80868088指令系統 計算機是通過執行指令序列來完成用戶的特定任務的,因此每種計算機都有一組指令集供用戶使用。這組指令集就稱為計算機的指令系統。 指令系統中的每一條指令都對應著微處理器要完成的一種規定的操作,這在設計微處理器時就事先規定好了,所以指令系統是表征一臺計算機性能的重要因素,它的格式與規模將直接影響到機器的硬件結構。 指令系統是程序員編寫程序的基礎,因此很好地掌握指令系統的有關知識是后續進一步學習的關鍵。,2021年2月8日 4,4.1.1 8086/8088指令編碼格式 通常在指令格式中包含操作碼和操作數兩大部分。 其中操作碼表示計算機執行什么操作,操作數指明參與操作的對象,或規定操作對象的地址(即操作對象的存放位置)。 如何尋找操作數(即操作對象),這就是指令的尋址方式,它是由指令編碼格式指出的。,2021年2月8日 5,80868088指令系統采用變字長的指令編碼格式,其指令可由16個字節組成,它包括操作碼(第一字節),尋址方式(第二字節),位移量、立即數(第三到第六字節)三部分組成。其中,尋址方式、位移量、立即數為操作數部分。,2021年2月8日 6,opcode,opcode,Mod字節,opcode,Mod字節,opcode,Mod字節,opcode,Mod字節,opcode,Mod字節,Data/disp,disp低,Data/disp低,Data/disp高,disp高,disp低,disp高,Data,Data低,Data高,操作碼部分,操作數部分,一字節指令,二字節指令,三字節指令,四字節指令,五字節指令,2021年2月8日 7,雙操作數指令中各字段定義2021年2月8日 8,例4.1 寫出下面指令的機器語言編碼。 MOV BXDI6,CL,指令碼為 88H、49H、FAH,OPCODE D W,mod,r/m,reg,disp8,100010,01,001,0010,011111010,例4.2 寫出下面指令的機器語言編碼。 ADD AX,BXDI0826,03H 81H 26H 08H2021年2月8日 9,4.1.2 8086/8088指令系統的尋址方式 所謂尋址方式就是尋找操作數存放地址(位置)的方法。在8086/8088系統中操作數存放的位置有以下4種 操作數包含在指令字節中。即指令格式中操作數部分就是操作數本身。這種操作數叫立即數操作數。 操作數存放在CPU的某個內部寄存器中。這種操作數叫寄存器操作數。 操作數在內存的數據區中。這種操作數叫存儲器操作數。,2021年2月8日 10, 操作數來自或送到I/O端口。這種操作數叫I/O操作數。 在8086/8088系統中,操作數又可分為兩大類數據操作數和地址操作數。因此,尋址方式也分為數據尋址方式和地址尋址方式兩大類。 1. 數據的尋址方式 對于數據操作數,有四種形式 無操作數 單操作數可以是源操作數,也可以是目的操作數。,2021年2月8日 11, 雙操作數一個是源操作數,一個是目的操作數。 隱含操作數可能隱含一個操作數(源或目的),也可能隱含兩個操作數。 源操作數在操作過程中其值不變的操作數。(可以提供數據的操作數) 目的操作數在操作后可被操作結果代替的操作數。(可以接收數據的操作數) 1)立即數尋址方式 例如MOV AL, 80H MOV AX, 1234H,2021年2月8日 12MOV AL, 80H,MOV AX, 1234H,2021年2月8日 13,2)寄存器尋址方式 例如INC CX MOV AX, CX,89,C1,程序存儲器,AX,CX指令碼 (包括操作數),2021年2月8日 14,3)存儲器尋址方式 存儲器尋址方式的操作數存放在存儲器單元中。因此,要存取操作數就必須知道其存儲器的單元地址。在指令中可以直接給出或間接給出操作數的地址,以達到存取操作數的目的。 指令中給出的地址只是操作數的有效地址(EA),并且是放在方括號(“ ”)中。若要從存儲器中存取操作數還須得到實際的地址(物理地址)。 物理地址段地址左移四位有效地址,物理地址,CS DS SS ES, 10H, EA,2021年2月8日 15,有效地址可以由以下三種地址分量組成 位移量它是存放在指令中的一個8位或16位的帶符號數。 基 址它是存放在基址寄存器BX或BP中的內容。 變 址它是存放在變址寄存器SI或DI中的內容。 對于某條具體指令,這三個地址分量可有不同的組合。正是因為這三種地址分量有不同的組合,才使得對存儲器操作數的尋址產生了若干種不同的方式。,2021年2月8日 16, 直接尋址方式 MOV AL, 1064H 1064HEA 16位 disp,2021年2月8日 17, 寄存器間接尋址 MOV AX, SI MOV BX, AL,SI 2000H,BX 1000H,MOV AX, SI,MOV BX, AL,2021年2月8日 18, 寄存器相對尋址,MOV CL, BX1064H,2021年2月8日 19, 基址加變址尋址方式 MOV AH, BPSI,BP 2000H,SI 1200H,2021年2月8日 20, 基址加變址相對尋址 MOV BXDI1234H, AH,BX 0200H,DI 0010H,2021年2月8日 21,4)I/O端口尋址方式 直接端口尋址方式 IN AL, 21H2021年2月8日 22, 間接端口尋址方式 OUT DX, AL,2021年2月8日 23,2.地址的尋址方式 地址的尋址方式其時是程序轉移地址的尋址方式,也就是找出程序轉移的地址號,而不是操作數。 轉移地址可以在段內(稱段內轉移),也可以跨段(稱段間轉移)。尋求轉移地址的方法有以下四種 1)段內直接尋址 轉移的地址是當前IP內容和指令規定的8位或16位位移量之和。 當位移量是8位時,稱為短程轉移;位移量是16位時稱為近程轉移。,2021年2月8日 24,這種尋址方式適用于條件轉移或無條件轉移類指令。但條件轉移只有8位位移量的短程轉移。當前IP,有效轉移地址,opcode,位移量,PM,CS 10H EA位移量,2021年2月8日 25,例JMP SHORT ALPHA 本例指令是一無條件轉移指令,指令采用了段內直接尋址方式。符號地址ALPHA代表位移量。設ALPHA20H,開始執行該指令時,CS1500H,IP3200H,于是該指令在存儲器中的起始地址為 15000H3200H18200HOP,20H,存儲器,15000H,18200H,18201H,18202H,18222H,20H,當前代碼段首地址,JMP SHORT ALPHA,轉移地址,而轉移有效地址為 EA當前IPALPHA3202H20H3222H 轉移物理地址為 PA15000H3222H18222H 執行完這條指令后,IP的內容變成3222H不再是3202H,CPU將轉移到存儲單元地址18222H中去取指令來執行。,2021年2月8日 26,2)段內間接尋址方式 程序轉移的地址存放在寄存器或存儲器單元中。指令執行使用寄存器或存儲器單元的內容來更新IP的內容。,例如 JMP BX JMP WORD PTR ADDR JMP WORD PTR BXARRY,2021年2月8日 27,例JMP WORD PTR BETA 本指令是無條件轉移指令,可使程序轉移到根據BETA指示的內存單元中取出的偏移地址開始執行指令。指令采用的是段內間接尋址方式。指令的操作數地址是一個符號地址BETA,所以可用數據尋址方式中的直接尋址方式得到存儲轉移偏移地址的內存單元地址。設當前CS0120H,IP2400H,BETA0100H,DS2000H,20100H00H,20101H27H,則存儲轉移偏移地址的內存單元地址為 DS左移4位BETA20000H0100H 20100H 又20100H00H,20101H27H,即轉移物理地址為 PA01200H2700H03900H 執行完這條指令后,IP的內容變成2700H,CPU將轉移到存儲單元03900H去執行程序。OP,OP,00H存儲器01200,03600,03601,03602,03900,當前代碼段首址,JMP WORD PTR BETA,轉移地址00H,27H,01H,20000,20100,20101,數據區首地址,036032700HIP2021年2月8日 28,3)段間直接尋址方式 這種尋址方式是指令碼中直接給出16位的段地址和16位的偏移地址用來更新當前的CS和IP內容。,2021年2月8日 29,例JMP FAR PTR GAMMA 本例指令為無條件轉移指令,采用段間直接尋址方式。設當前CS2000H IP1000H GAMMA30004000 則本指令的起始地址為 20000H1000H21000H 轉移物理地址為 PA30000H4000H34000H 執行完這條指令后,CS的內容變成3000H,IP的內容變成4000H,從而程序轉移到存儲單元34000H開始執行。,2021年2月8日 30,4)段間間接尋址方式 這種尋址方式是由指令碼的尋址方式字節求出存放轉移地址的連續兩個字的地址。其低位字地址單元中存放的是偏移地址,高位字地址單元中存放的是轉移段地址。,2021年2月8日 31,例JMP DWORD PTR DELTABX 本例指令是無條件轉移指令,采用段間間接尋址方式。 設當前CS1000H,IP0100H,DS2000H,BX3000H,DELTA0040H,23040H00H,23041H50H,23042H00H,23043H30H,則間接存儲地址按寄存器相對尋址為 DS左移4位BXDELTA20000H3000H0040H 23040H 于是,可得轉移地址為 3000H5000H 即轉移物理地址為 PA30000H5000H35000H 執行本指令后,CS的內容和IP的內容分別變成3000H和5000H,程序轉移到存儲單元35000H開始執行。,2021年2月8日 32,指令執行前 CS1000H IP0100H DS2000H BX3000H DELTA0040H 指令執行后 CS3000H IP5000H,2021年2月8日 33,段間間接尋址方式,段間直接尋址方式段間直接和間接尋址的區別,2021年2月8日 34,4.1.3 8086/8088指令系統 8086/8088指令系統大致可分為六大類指令 數據傳送類指令 算術運算類指令 位操作類指令 串操作類指令 程序控制類指令 處理器控制類指令 學習指令系統著重要掌握指令的基本操作功能、合法的尋址方式及其對狀態標志位的影響。,2021年2月8日 35,1. 數據傳送類指令 數據傳送指令的主要功能是傳送數據、地址和標志。可分為通用數據傳送指令、輸入輸出指令、地址傳送指令和標志傳送指令。 1)通用數據傳送指令 通用數據傳送指令可完成字節或字數據的傳送。它可分為數據傳送指令、堆棧操作指令、數據交換指令和字節轉換指令。 1 數據傳送指令 指令格式MOV dst,src ;dstsrc,src表示源操作數字/字節 立即數操作數 寄存器操作數(包括段寄存器) 存儲器操作數,dst表示目的操作數字/字節 寄存器操作數不包括IP,CS段寄存器 存儲器操作數,2021年2月8日 36段寄存器 CS DS SS ES,存儲器,通用存儲器 AX BX CX DX BP SP SI DI AL BL CL DL AH BH CH DH,MOV指令數據傳送方向,16位,8/16位,8/16位,16位,8/16位,指令功能將源操作數傳送(復制)到目的操作數。 傳送方向如下圖所示。,立即數2021年2月8日 37,2 堆棧操作指令 堆棧操作指令是用來完成壓入和彈出堆棧操作的。80868088指令系統中提供了完成這兩種操作的相應指令。 壓入堆棧指令 指令格式及操作 PUSH src ;SPSP-2, ;SP1SPsrc,src表示源操作數字 寄存器操作數(包括段寄存器) 存儲器操作數,2021年2月8日 38,注意堆棧指令的操作數只能是字操作數(即16位操作數),且不能是立即數。 進棧操作(PUSH)先移后進 出棧操作( POP)先出后移, 彈出堆棧指令 指令格式及操作 POP dst ;dstSP1SP, ;SPSP2,dst表示目的操作數字 寄存器操作數不包括IP,CS段寄存器 存儲器操作數,2021年2月8日 39,3)交換指令 指令格式及操作 XCHG opr1,opr2 ;opr1opr2 注意交換指令的兩個操作數可以是寄存器操作數,存儲器操作數,但都不能是立即數操作數,也不能同時為存儲器操作數;寄存器操作數是指通用寄存器,不包括段寄存器。 也就是說,交換指令是完成寄存器與寄存器、寄存器與存儲器之間的數據互換功能。交換的兩個數據可以是8位的,也可以是16位的。,2021年2月8日 40,4)字節轉換指令 指令格式及操作 XLAT src_table ;AL BXAL XLAT指令是用來將一種字節代碼轉換成另一種字節代碼。即將BX的內容(代碼表格首址src_table)和AL的內容(表格偏移量)相加作為有效地址。并從中讀出此內存表格地址單元的內容傳送到AL累加器中。 XLAT指令還可以有以下幾種表示形式 XLAT ;不寫操作數 XLATB ;有B就不允許再寫操作數。 XLAT ESsrc_table ;重設段寄存器為ES,2021年2月8日 41,例在內存的數據段有一張16進制數的ASCII碼表,其首地址為Hex_table,如下圖所示,為欲將十六進制數0AH轉換成ASCII碼,則可用以下幾條指令實現 MOV BX, OFFSET Hex_tale;BX 表首址 MOV AL, 0AH ;AL 十六進制數A XLAT Hex_table;查表轉換,BX 1000H,AX 000AHHex_table,2021年2月8日 42,2 輸入/輸出指令 輸入輸出指令可以分為兩大類一類是直接端口地址的輸入輸出指令;一類是通過DX寄存器間接端口地址的輸入輸出指令。 1 輸入指令 直接尋址的輸入指令 指令格式及操作 IN acc, port ;accport 其中acc為8位或16位累加器AL/AX。port為8位端口地址,故可尋址256個端口。,2021年2月8日 43, 間接尋址的輸入指令 指令格式及操作 IN acc, DX ;accDX 其中acc為8位或16位累加器AL/AX。DX為16位間接尋址的端口地址寄存器,故可尋址64K個端口。 2 輸出指令 直接尋址的輸出指令 指令格式及操作 OUT port, acc ;portacc,2021年2月8日 44, 間接尋址的輸出指令 指令格式及操作 OUT DX, acc ;DXacc,2021年2月8日 45,3 地址傳送指令 1)取有效地址指令 指令格式 LEA reg16, mem 此指令的功能是將存放源操作數的16位偏移地址即有效地址EA送到一個16位的通用寄存器中。即源操作數必須是一個存儲器操作數,目的操作數必須是一個寄存器操作數。例如 LEA BX, buffer LEA AX, BPDI LEA DX, betyBXSI,2021年2月8日 46,注意LEA指令和MOV指令的異同,比較下面兩組指令 不同LEA BX,buffer ;將存儲器buffer的偏 移地址送到BX MOV BX,buffer ;將存儲器buffer的內 容傳送到BX 相同LEA BX,buffer MOV BX,OFFSET buffer 以上兩條指令都是將存儲器buffer的偏移地址送到BX。其中OFFSET buffer 表示存儲器偏移地址。,2021年2月8日 47,2)地址指針裝入DS指令 指令格式 LDS reg16,mem32 此指令的功能是將源操作數所對應的雙字長的內存單元中的高字內容(一般為16位段基址)送入DS,低字內容(一般為偏移地址)送入指令所指定的寄存器中。例如 LDS DI,2130H,2021年2月8日 48,3)地址指針裝入ES指令 指令格式 LES reg16,mem32 此指令的功能是將源操作數所對應的雙字長的內存單元中的高字內容(一般為16位段基址)送入ES,低字內容(一般為偏移地址)送入指令所指定的寄存器中。例如 LES DI,2130H,2021年2月8日 49,4 標志傳送指令 1)取標志指令 指令格式 LAHF 2)置標志指令 指令格式 SAHF,OF,DF,IF,TF,SF,ZFAFPFCF,FLAG,AH,LAHF和SAHF指令操作示意圖,2021年2月8日 50,3)標志壓入堆棧指令 指令格式及操作 PUSHF ;SPSP-2, SP1;SPFLAG 4)標志彈出堆棧指令 指令格式及操作 POPF ;FLAGSP1;SP, SPSP2,2021年2月8日 51,在使用這些傳送類指令時應注意以下幾點 目的操作數不能為立即數。 目的操作數為段寄存器CS不能作為目的操作數,源操作數不能為立即數。 源操作數為非立即數時,兩操作數之一必須為寄存器操作數。 操作數類型必須一致。 用BX、SI、DI來間接尋址時,默認的段寄存器為DS;用BP來間接尋址時,默認的段寄存器為SS。,2021年2月8日 52, 對于堆棧操作,源操作數不能為立即數;CS寄存器的值可以壓入堆棧,但反之則不允許。 數據交換指令的兩個操作數任一都不能是立即數。 換碼指令的操作數是一種特殊的基址變址尋址方式,基址寄存器為BX,變址寄存器為AL。 除了SAHF和POPF指令外,其余指令都不會影響標志。,2021年2月8日 53,2、算術運算類指令,80868088有豐富的算術運算指令,而且可以處理4種類型的數據,如下表所示,2021年2月8日 54,1 加法指令,在微處理器中,沒有專用的BCD碼運算指令,使用二進制運算指令進行BCD碼數的運算,然后用BCD碼運算調整指令進行調整,重新得到BCD碼的結果。,2021年2月8日 55,AAA指令的操作為非壓縮型BCD碼調整) 如果AL0FH9 或 AF1 則ALAL06H AHAH1 AF1 CFAF ALAL0FH 否則ALAL0FH DAA指令的操作為 壓縮型BCD碼調整) 如果AL0FH9, AF1 則ALAL06H AF1 如果AL9FH 或 CF1 則ALAL60H CF1,2021年2月8日 56,例要求計算兩個十進制數之和,78。可用以下指令實現 非壓縮型BCD碼調整 MOV AX, 0007H;AL07H,AH00H MOV BL, 08H;BL08H ADD AL, BL;AL0FH AAA;AL05H,AH01H ;CFAF1 壓縮型BCD碼調整 MOV AX, 0007H;AL07H,AH00H MOV BL, 08H;BL08H ADD AL, BL;AL0FH DAA;AL15H,AH00H;CF0,AF1,2021年2月8日 57,例要求計算兩個十進制數之和,5634。可用以下指令實現壓縮型BCD碼調整 MOV AX, 3456H;AL56H,AH34H ADD AL, AH ;AL8AH DAA ;AL90H 例要求計算兩個BCD數的ASCII碼之和,即 59。可用以下指令實現ASCII碼調整 MOV AL, 5 ;AL35H ADD AL, 9 ;39H,AL6EH MOV AH, 0 ;AH00H AAA;AH01H,AL04H OR AX,3030H;AX3134H,即34,2021年2月8日 58,2 減法指令,2021年2月8日 59,AAS指令的操作為 非壓縮型BCD碼調整 如果 AL0FH9 或 AF1 則ALAL06H AHAH1 AF1 CFAF ALAL 0FH 否則ALAL 0FH DAS指令的操作為 壓縮型BCD碼調整 如果AL0FH9, AF1 則ALAL06H AF1 如果AL9FH 或 CF1 則ALAL60H CF 1,2021年2月8日 60,例要求計算兩個十進制數之差,86-7。可用以下指令實現 非壓縮型BCD碼 MOV AX, 0806H;AH08H,AL06H SUB AL, 07H;AX08FFH AAS ;AX0709H 例要求計算兩個十進制數之差,134-56。可用以下指令實現 壓縮型BCD碼 MOV AX, 5634H;AH56H,AL34H SUB AL, AH;ALDEH,有借位 DAS ;AL78H,2021年2月8日 61,3 乘法指令,AL,源操作數,AL,AH,AX,源操作數,AX,DX,2021年2月8日 62,AAM指令的操作為將二進制數轉換成十進制數 AHAL/0AH的商;即AL除以10,商送AH ALAL/0AH的余;即AL除以10,余數送AL 例要求進行以下十進制乘法運算79 解可編程序段如下 MOV AL,07H ;AL07H MOV BL,09H ;BL09H MUL BL ;AX07H09H003FH AAM ;AH06H,AL03H,2021年2月8日 63,4除法指令,2021年2月8日 64,8086/8088CPU執行除法時規定除數只能是被出數的一半字長。當被除數為16位時,除數應為8位;當被除數為32位時,除數應為16位。,AL,源操作數,AX,AH,AX,AX,源操作數,DX,DX,商,商,余數,余數,8位,16位,16位,32位,除數,除數,被除數,被除數,2021年2月8日 65,AAD指令的操作為十進制數轉換成二進制數 ALAH0AHAL AH0 例要進行以下十進制除法運算732 解可編程序段如下 MOV AH,07H ;AH07H MOV AL,03H ;AL03H MOV BL,02H ;BL02H AAD ;AL49H即十進制數73 DIV BL ;AL24H商,AH01H余數 AAM ;AH03H,AL06H,2021年2月8日 663.位操作類指令 位操作指令是對8位或16位的寄存器或存儲單元中的內容按位進行操作。這一類指令包括邏輯運算指令、移位指令和循環移位指令等三組。 1 邏輯運算指令 邏輯運算類指令與算術運算指令不同,算術指令是按字節或字進行算術運算,而邏輯運算指令是把操作數按位來進行邏輯運算。,2021年2月8日 67說明TEST相當于AND運算,但是不保存結果,僅影響標志。,2021年2月8日 68,常見的用法舉例 清進位標志位AND AX,AX 或 OR AL,AL等。 清零操作數XOR AX,AX 不僅把AX清零,而且也影響了狀態標志。 把某幾位取反用XOR指令,把要取反的位和1異或,不變的位和0異或。 清零或置位某幾位用AND指令清零,用OR指令置位。,2021年2月8日 69,2 移位操作指令 該類指令的使用方法是 移動1位,用類似于 SHL AX,1的格式 移動n位,用類似于 SHL AX,CL的格式CFdstCF0,dstCF0,dstCF0,dst,2021年2月8日 70,說明 邏輯移位適用于無符號數,算術移位適用于有符號數。 邏輯左移和算術左移的機器碼完全相同,是助記符的兩種寫法。,2021年2月8日 71,說明 循環移位常用來變換數據格式。CFdst,CFdst,CFdstCFdst,2021年2月8日 72,使用舉例 例一 利用循環移位指令可以對寄存器或存儲器中的任一位進行測試。如要測試AL寄存器中的第5位的狀態是“0”還是“1”,則可利用以下 指令實現 MOV CL,5;CL移位次數 ROR AL,CL;CFAL的第5位 JNC ZERO;若CF0,轉ZARO ;否則 ZERO ,2021年2月8日 73,例二 利用帶進位循環移位指令可以實現將兩個以上寄存器或存儲器單元組合起來一起移位。如DX和AX兩個寄存器組成的32位數乘以2,可用以下兩條指令實現 SHL AX,1 ;AX左移1位,CFAX的最高位 RCL DX,1 ;DX帶進位左移1位,DX的最低位CF 具體操作如下圖,CF,DX,AX,0, RCL DX,1, SHL AX,1,2021年2月8日 744.串操作指令 串操作指令的特征是對數據塊,也稱數據串 (字符串或數值串)進行操作。其操作數為隱含操作數,并且其中部分指令的兩個操作數可以同時是存儲器操作數。 串傳送 MOVS Move string 串比較 CMPS Compare string 串掃描 SCAS Scan string 串裝入 LODS Load from string 串保存 STOS Store in to string,2021年2月8日 75,說明 串操作指令每次執行完成一個字節或一個字的操作。 通常使用重復前綴來自動完成一個數據塊(數據串)的操作。 重復前綴 REP 重復 REPE/REPZ 相等/為零則重復 REPNE/REPNZ不相等/不為零則重復,2021年2月8日 76,特點 串操作指令需要指明每次操作的數據串數據的類型B表示字節串,W表示字串。 例如MOVSB, CMPSW等。 串操作指令使用DSSI作為源操作數的指針;ESDI作為目的操作數的指針 使用DF來表示每次操作以后變址寄存器SI和DI的變化方向 CLD ;DF0 SI,DI做增量變化 B1或W2 STD ;DF1 SI,DI做減量變化 B-1或W-2 使用CX來表示用重復前綴以后指令需要重復執行的次數(通常是數據串的長度),2021年2月8日 77,2021年2月8日 78,2021年2月8日 795.控制轉移類指令 能夠使程序的執行流程發生改
總結
以上是生活随笔為你收集整理的微型计算机原理王忠民PPT,微型计算机原理4 王忠民著.ppt的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 夺旗赛 CTF 六大方向基础工具简介集合
- 下一篇: php表单美化,使用css美化html表