匯編語言 第4章_第1頁
匯編語言 第4章_第2頁
匯編語言 第4章_第3頁
匯編語言 第4章_第4頁
匯編語言 第4章_第5頁
已閱讀5頁,還剩65頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、作業(yè): P112 1、2 實(shí)驗(yàn)教程 P60 4 第4章 匯編語言程序設(shè)計(jì)基本技術(shù)教學(xué)重點(diǎn)綜合應(yīng)用第2章硬指令和第3章偽指令,第4章從程序結(jié)構(gòu)角度展開程序設(shè)計(jì),重點(diǎn)掌握:分支結(jié)構(gòu)程序設(shè)計(jì)循環(huán)結(jié)構(gòu)程序設(shè)計(jì)匯編語言程序設(shè)計(jì)的過程通常都包括以下步驟:1. 分析問題,確定算法2. 編制程序流程3. 正確、合理使用存貯器和寄存器4. 編寫程序5. 調(diào)試運(yùn)行程序程序的基本結(jié)構(gòu)形式有:順序程序、分支程序、循環(huán)程序和子程序。順序程序的最大特點(diǎn):程序從運(yùn)行開始到結(jié)尾一直是按順序逐條執(zhí)行指令,且每條指令只執(zhí)行一次。4.1 順序程序設(shè)計(jì)順序程序完全按指令書寫的前后順序執(zhí)行每一條指令,是最基本、最常見的程序結(jié)構(gòu)例4.1

2、 計(jì)算例4.2 移位例題 代碼轉(zhuǎn)換例4.1-1.model small.stack.data Xdw 5 Ydw 6 Zdw 7 Wdw ?.code.startupmov ax,Xadd ax,Yadd ax,Zmov W,ax.exit 0enddata segment X dw 5 Y dw 6 Z dw 7 W dw ? data ends code segment assume cs:code,ds:data start: push ds ;保存舊的數(shù)據(jù)段地址 sub ax,ax push ax 例4.1-2mov ax, data ;將data數(shù)據(jù)段地址mov ds, ax ;送往

3、ds段寄存器mov ax, Xadd ax, Yadd ax, Zmov W, axmov ah, 4chint 21h ;返回DOS code ends end start 例4.21/2.dataqvardq 1234567887654321h ;定義4字變量.code .startupmov al,byte ptr qvar6mov byte ptr qvar7,almov al,byte ptr qvar5mov byte ptr qvar6,almov al,byte ptr qvar4mov byte ptr qvar5,almov al,byte ptr qvar3mov byt

4、e ptr qvar4,almov al,byte ptr qvar2mov byte ptr qvar3,al圖示例4.22/2mov al,byte ptr qvar1mov byte ptr qvar2,almov al,byte ptr qvar0mov byte ptr qvar1,almov byte ptr qvar0,0.exit 0end12 34 56 78 87 65 43 21h34 56 78 87 65 43 21 00h移位后圖示64位數(shù)據(jù)左移8位123456788765432100qvar0qvar1qvar2qvar3qvar4qvar5qvar6qvar7換

5、碼指令執(zhí)行前:在主存建立一個(gè)字節(jié)量表格,內(nèi)含要轉(zhuǎn)換成的目的代碼表格首地址存放于BX,AL存放相對(duì)表格首地址的位移量換碼指令執(zhí)行后:將AL寄存器的內(nèi)容轉(zhuǎn)換為目的代碼 換碼指令XLAT(translate)將BX指定的緩沖區(qū)中、AL指定的位移處的一個(gè)字節(jié)數(shù)據(jù)取出賦給ALXLATXLAT;alds:bx+al例:代碼轉(zhuǎn)換mov bx,100hmov al,03hxlat 換碼指令沒有顯式的操作數(shù),但使用了BX和AL;因?yàn)閾Q碼指令使用了隱含尋址方式采用默認(rèn)操作數(shù)XLAT例題 代碼轉(zhuǎn)換1/2;查表法,實(shí)現(xiàn)一位16進(jìn)制數(shù)轉(zhuǎn)換為ASCII碼顯示.model small.stack 256.dataASCII

6、db 30h,31h,32h,33h,34h,35hdb 36h,37h,38h,39h ;09的ASCII碼db 41h,42h,43h,44h,45h,46h;AF的ASCII碼hexdb 0bh;任意設(shè)定了一個(gè)待轉(zhuǎn)換的一位16進(jìn)制數(shù)例題 代碼轉(zhuǎn)換2/2.code.startupmov bx,offset ASCII ;BX指向ASCII碼表mov al,hex ;AL取得一位16進(jìn)制數(shù),正是ASCII碼表中位移and al,0fh ;只有低4位是有效的,高4位清0 xlat ;換碼:ALDS:BXALmov dl,al ;入口參數(shù):DLALmov ah,2 ;02號(hào)DOS功能調(diào)用int

7、21h ;顯示一個(gè)ASCII碼字符.exit 0end4.2 輸入輸出功能調(diào)用向顯示器輸出字符 字符的輸出 字符串的輸出從鍵盤輸入數(shù)據(jù) 字符的輸入 字符串的輸入 按鍵的判斷裸機(jī)ROM-BIOSDOS功能調(diào)用匯編語言程序第 4 章4.2.1 中斷指令中斷(Interrupt )是一種改變程序執(zhí)行順序的方法中斷具有多種中斷類型中斷的指令有3條:INT i8 IRET INTO本節(jié)主要掌握類似子程序調(diào)用指令的中斷調(diào)用指令I(lǐng)NT i8,進(jìn)而學(xué)習(xí)使用DOS功能調(diào)用中斷的過程主程序IRET中斷服務(wù)程序斷點(diǎn)中斷請(qǐng)求中斷請(qǐng)求可以來自處理器外部的中斷源,也可以由處理器執(zhí)行指令引起:例如執(zhí)行INT i8指令。80

8、86的外部中斷8086可以管理256個(gè)中斷各種中斷用一個(gè)向量編號(hào)來區(qū)別主要分成外部中斷和內(nèi)部中斷外部中斷來自CPU之外的原因引起的中斷,又可以分成可屏蔽中斷:可由CPU的中斷允許標(biāo)志IF控制非屏蔽中斷:不受CPU的中斷允許標(biāo)志IF控制8086的內(nèi)部中斷內(nèi)部中斷CPU內(nèi)部執(zhí)行程序引起的中斷,又可以分成:除法錯(cuò)中斷:執(zhí)行除法指令,結(jié)果溢出產(chǎn)生的 0 號(hào)中斷指令中斷:執(zhí)行中斷調(diào)用指令I(lǐng)NT i8產(chǎn)生的 i8 號(hào)中斷斷點(diǎn)中斷:用于斷點(diǎn)調(diào)試(INT 3)的 3 號(hào)中斷溢出中斷:執(zhí)行溢出中斷指令,OF1產(chǎn)生的 4 號(hào)中斷單步中斷:TF1在每條指令執(zhí)行后產(chǎn)生的 1 號(hào)中斷中斷指令I(lǐng)NTINT i8;中斷調(diào)用

9、指令:產(chǎn)生i8號(hào)中斷IRET;中斷返回指令:實(shí)現(xiàn)中斷返回INTO;溢出中斷指令:;若溢出標(biāo)志OF=1,產(chǎn)生4號(hào)中斷;否則順序執(zhí)行4.2.2 系統(tǒng)功能調(diào)用21H號(hào)中斷是DOS提供給用戶的用于調(diào)用系統(tǒng)功能的中斷,它有近百個(gè)功能供用戶選擇使用,主要包括設(shè)備管理、目錄管理和文件管理三個(gè)方面的功能ROM-BIOS也以中斷服務(wù)程序的形式,向程序員提供系統(tǒng)的基本輸入輸出程序匯編語言程序設(shè)計(jì)需要采用系統(tǒng)的各種功能程序充分利用操作系統(tǒng)提供的資源是程序設(shè)計(jì)的一個(gè)重要方面,需要掌握功能調(diào)用的步驟通常按照如下4個(gè)步驟進(jìn)行: 在AH寄存器中設(shè)置系統(tǒng)功能調(diào)用號(hào) 在指定寄存器中設(shè)置入口參數(shù) 執(zhí)行指令I(lǐng)NT 21H(或ROM

10、-BIOS的中斷向量號(hào)),實(shí)現(xiàn)中斷服務(wù)程序的功能調(diào)用 根據(jù)出口參數(shù),分析功能調(diào)用執(zhí)行情況字符輸出的功能調(diào)用DOS功能調(diào)用INT 21H功能號(hào):AH02H入口參數(shù):DL字符的ASCII碼功能:在顯示器當(dāng)前光標(biāo)位置顯示給定的字符,光標(biāo)右移一個(gè)字符位置。如按Ctrl-Break或Ctrl-C則退出例:顯示問號(hào);在當(dāng)前顯示器光標(biāo)位置顯示一個(gè)問號(hào)mov ah,02h;設(shè)置功能號(hào):ah02hmov dl,?;提供入口參數(shù):dl?int 21h;DOS功能調(diào)用:顯示 進(jìn)行字符輸出時(shí),當(dāng)輸出響鈴字符(07H)以及退格(08H)、回車(0DH)和換行(0AH)字符時(shí),該功能調(diào)用可以自動(dòng)識(shí)別并能進(jìn)行相應(yīng)處理字符串

11、輸出的功能調(diào)用DOS功能調(diào)用INT 21H功能號(hào):AH09H入口參數(shù):DS:DX欲顯示字符串在主存中的首地址字符串應(yīng)以$(24H)結(jié)束功能:在顯示器輸出指定的字符串可以輸出回車(0DH)和換行(0AH)字符產(chǎn)生回車和換行的作用例:顯示字符串string db Hello,Everybody !,0dh,0ah,$ ;在數(shù)據(jù)段定義要顯示的字符串.mov ah,09h;設(shè)置功能號(hào):ah09hmov dx,offset string;提供入口參數(shù):dx字符串的偏移地址int 21h;DOS功能調(diào)用:顯示字符輸入的功能調(diào)用DOS功能調(diào)用INT 21H功能號(hào):AH01H出口參數(shù):AL字符的ASCII碼功

12、能:獲得按鍵的ASCII代碼值調(diào)用此功能時(shí),若無鍵按下,則會(huì)一直等待,直到按鍵后才讀取該鍵值例:字符輸入+判斷按鍵getkey:mov ah,01h;功能號(hào):ah01hint 21h;功能調(diào)用cmp al,Y;處理出口參數(shù)alje yeskey;是“Y”cmp al,Nje nokey;是“N”jne getkey.yeskey:.nokey:.字符串輸入的功能調(diào)用DOS功能調(diào)用INT 21H功能號(hào):AH0AH入口參數(shù):DS:DX緩沖區(qū)首地址執(zhí)行該功能調(diào)用時(shí),用戶按鍵,最后用回車確認(rèn)本調(diào)用可執(zhí)行全部標(biāo)準(zhǔn)鍵盤編輯命令;用戶按回車鍵結(jié)束輸入,如按CtrlBreak或CtrlC則中止關(guān)鍵要定義好緩沖

13、區(qū)緩沖區(qū)的定義第1字節(jié)事先填入最多欲接收的字符個(gè)數(shù)(包括回車字符,可以是1255)第2字節(jié)將存放實(shí)際輸入的字符個(gè)數(shù)(不包括回車符)第3字節(jié)開始將存放輸入的字符串實(shí)際輸入的字符數(shù)多于定義數(shù)時(shí),多出的字符丟掉,且響鈴擴(kuò)展ASCII碼(如功能鍵等)占兩個(gè)字節(jié),第1個(gè)為0例: 輸入字符串buffer db 81 ;緩沖區(qū)長(zhǎng)度 ;第1個(gè)字節(jié)填入可能輸入的最大字符數(shù)db ? ;保留為填入實(shí)際輸入的字符數(shù)db 81 dup(0) ;存放輸入的字符串.mov dx,seg buffer ;偽指令seg取得buffer的段地址mov ds,dx ;設(shè)置數(shù)據(jù)段DSmov dx,offset buffermov a

14、h,0ahint 21h按鍵判斷的功能調(diào)用DOS功能調(diào)用INT 21H功能號(hào):AH0BH出口參數(shù):AL0,當(dāng)前沒有按鍵;ALFFH,當(dāng)前已經(jīng)按鍵。功能:僅判斷當(dāng)前是否有按下的鍵,設(shè)置AL后退出例: 按任意鍵繼續(xù).;提示“按任意鍵繼續(xù)”getkey:mov ah,0bhint 21hor al,al;al0?jz getkey ;al0,沒有按鍵,繼續(xù)等待4.3 分支程序設(shè)計(jì)分支程序根據(jù)條件是真或假?zèng)Q定執(zhí)行與否判斷的條件是各種指令,如CMP、TEST等執(zhí)行后形成的狀態(tài)標(biāo)志轉(zhuǎn)移指令Jcc和JMP可以實(shí)現(xiàn)分支控制單分支:求絕對(duì)值雙分支:例4.3多分支:例4.4單分支程序設(shè)計(jì)條件成立跳轉(zhuǎn),否則順序執(zhí)行

15、分支語句體注意選擇正確的條件轉(zhuǎn)移指令和轉(zhuǎn)移目標(biāo)地址第4章例題 求絕對(duì)值;計(jì)算AX的絕對(duì)值cmp ax,0jns nonneg;分支條件:AX0neg ax;條件不滿足,求補(bǔ)nonneg:mov result,ax;條件滿足;計(jì)算AX的絕對(duì)值cmp ax,0jl yesneg;分支條件:AX0jmp nonnegyesneg:neg ax;條件不滿足,求補(bǔ)nonneg:mov result,ax;條件滿足Good Bad雙分支程序設(shè)計(jì)條件成立,跳轉(zhuǎn)執(zhí)行第2個(gè)分支語句體;否則順序執(zhí)行第1個(gè)分支語句體注意:第1個(gè)分支體后一定要有一個(gè)JMP指令跳到第2個(gè)分支體后第4章例題 顯示BX最高位shl bx,

16、1;BX最高位移入CFjc one;CF1,即最高位為1,轉(zhuǎn)移mov dl,0 ;CF0,即最高位為0,DL0jmp two;一定要跳過另一個(gè)分支體one:mov dl,1;DL1two:mov ah,2int 21h;顯示對(duì)比 雙分支程序改為單分支程序例題 顯示BX最高位shl bx,1;BX最高位移入CFjnc one;CF0,即最高位為0,轉(zhuǎn)移mov dl,1 ;CF1,即最高位為1,DL1jmp two;一定要跳過另一個(gè)分支體one:mov dl,0 ;DL0two:mov ah,2int 21h;顯示 雙分支程序改為單分支程序?qū)Ρ壤} 顯示BX最高位mov dl,0;DL0shl b

17、x,1;BX最高位移入CFjnc two;CF0,最高位為0,轉(zhuǎn)移mov dl,1;CF1,最高位為1,DL1two:mov ah,2int 21h;顯示 編寫分支程序,需留心分支的開始和結(jié)束例4.3 判斷有無實(shí)根1/2.startupmov al,_bimul almov bx,ax;BX中為b2mov al,_aimul _cmov cx,4imul cx;AX中為4ac(設(shè)DX中無有效數(shù)據(jù))例4.3 判斷有無實(shí)根2/2cmp bx,ax;比較二者大小jge yes;條件滿足?mov tag,0;第一分支體:條件不滿足,tag0jmp done;跳過第二個(gè)分支體yes:mov tag,1;

18、第二分支體:條件滿足,tag1done:.exit 0多分支程序設(shè)計(jì)多個(gè)條件對(duì)應(yīng)各自的分支語句體,哪個(gè)條件成立就轉(zhuǎn)入相應(yīng)分支體執(zhí)行。多分支可以化解為雙分支或單分支結(jié)構(gòu)的組合,例如: or ah,ah;等效于cmp ah,0 jz function0;ah0,轉(zhuǎn)向function0 dec ah;等效于cmp ah,1 jz function1;ah1,轉(zhuǎn)向function1 dec ah;等效于cmp ah,2 jz function2;ah2,轉(zhuǎn)向function2第4章圖示多分支結(jié)構(gòu)AH=0fuction0YNAH=1fuction1YNAH=2fuction2YN種類條件轉(zhuǎn)移指令判斷條件

19、條件組合關(guān)系OF SF ZF PF CF簡(jiǎn)單條件轉(zhuǎn)移指令JOJNOJSJNSJZ/JEJNZ/JNEJP/JPEJNP/JPOJCJNCJA/JNBEJAE/JNBJB/JNAEJBE/JNAJG/JNLEJGE/JNLJL/JNGEJLE/JNG無符號(hào)數(shù)條件轉(zhuǎn)移指令帶符號(hào)數(shù)條件轉(zhuǎn)移指令1 01 01 01 01 00 00 10 111aabb0 10 1aabbANDORANDOR(a=b) AND ZF=0(a=b) OR ZF=1(ab) AND ZF=0(ab) OR ZF=1地址表形成多分支需要在數(shù)據(jù)段事先安排一個(gè)按順序排列的轉(zhuǎn)移地址表輸入的數(shù)字作為轉(zhuǎn)移地址表內(nèi)的偏移量。 16位偏

20、移地址占用2個(gè)字節(jié)單元,所以偏移量需要乘2關(guān)鍵是要理解間接尋址方式JMP指令地址表分支1地址分支2地址.Tabledw disp1, disp2, disp3, disp4, .datamsgdb Input number(18):,0dh,0ah,$msg1db Chapter 1 : .,0dh,0ah,$msg2db Chapter 2 : .,0dh,0ah,$.msg8db Chapter 8 : . ,0dh,0ah,$tabledw disp1,disp2,disp3,disp4dw disp5,disp6,disp7,disp8;定義各個(gè)標(biāo)號(hào)的偏移地址例4.4 數(shù)據(jù)段1/3此處

21、等同于 offset disp1.code.startupstart1:mov dx,offset msgmov ah,9 ;顯示“Input number(18):”int 21hmov ah,1;等待按鍵輸入int 21hcmp al,1;數(shù)字 8?ja start1and ax,000fh;將ASCII碼轉(zhuǎn)換成數(shù)字例4.4 代碼段2/3dec ax ;偏移量從0開始shl ax,1 ;等效于add ax,ax 即變?yōu)榕紨?shù)mov bx,axjmp tablebx;(段內(nèi))間接轉(zhuǎn)移:IPtable+bxstart2:mov ah,9 ;顯示字符串int 21h.exit 0disp1:mov

22、 dx,offset msg1;處理程序1jmp start2. end例4.4 代碼段3/3可以改為 call tablebx對(duì)應(yīng)修改為 retAH=9時(shí),INT 21H的功能是顯示字符串,要求必須以$字符作為定界符,來計(jì)算串的長(zhǎng)度。顯示字符串時(shí),如果希望光標(biāo)能自動(dòng)換行,則可在字符串結(jié)束前加上回車(0dH)和換行(0aH)的ASCII碼。作業(yè): 實(shí)驗(yàn)教程 P61 13 P62 34 例:有數(shù)組 x(x1,x2,x10) 和 y(y1,y2,y10), 編程計(jì)算 z(z1,z2,z10)z1 = x1 + y1z2 = x2 + y2z3 = x3 - y3z4 = x4 - y4z5 = x

23、5 - y5z6 = x6 + y6z7 = x7 - y7z8 = x8 - y8z9 = x9 + y9z10= x10 + y10.datax dw x1,x2,x3,x4,x5,x6,x7,x8,x9,x10y dw y1,y2,y3,y4,y5,y6,y7,y8,y9,y10z dw z1,z2,z3,z4,z5,z6,z7,z8,z9,z10logic_rule dw 00dch ;邏輯尺: 0000,0000,1101,1100 ; 1 減法 0 加法 mov bx, 0 ;設(shè)置數(shù)組內(nèi)偏移量 mov cx, 10 ;設(shè)置計(jì)數(shù)器 mov dx, logic_rulenext: mo

24、v ax, xbx shr dx, 1 ;判斷邏輯尺最低位 jc subtract ;為1,進(jìn)行減法 add ax, ybx ;為0,進(jìn)行加法 jmp short result ;存結(jié)果subtract: sub ax, ybxresult: mov zbx, ax add bx, 2 ;設(shè)置數(shù)組內(nèi)下一字單元 loop next 4.4 循環(huán)程序設(shè)計(jì)循環(huán)結(jié)構(gòu)一般是根據(jù)某一條件判斷為真或假來確定是否重復(fù)執(zhí)行循環(huán)體循環(huán)指令和轉(zhuǎn)移指令可以實(shí)現(xiàn)循環(huán)控制多重循環(huán):例4.6循環(huán)指令LOOP:例4.5DO-WHILE 結(jié)構(gòu) DO-UNTIL 結(jié)構(gòu)控制條件初始化循環(huán)體YN控制條件初始化循環(huán)體YNDO-UNTI

25、L 循環(huán)結(jié)構(gòu) 結(jié)束 初始化 循環(huán)的初始狀態(tài) 循環(huán)體 循環(huán)的工作部分及修改部分 計(jì)數(shù)控制循環(huán)條件控制循環(huán)修改部分控制條件YN循環(huán)指令(loop)循環(huán)指令默認(rèn)利用CX計(jì)數(shù)器,方便實(shí)現(xiàn)計(jì)數(shù)循環(huán)的程序結(jié)構(gòu)label操作數(shù)采用相對(duì)尋址方式LOOP label;CXCX1, ;CX0,循環(huán)到標(biāo)號(hào)label處LOOPZ/LOOPE label;CXCX1, ;CX0且ZF1,循環(huán)到標(biāo)號(hào)label處LOOPNZ label;CXCX1, ;CX0且ZF0,循環(huán)到標(biāo)號(hào)label處.model small.stack.datasumdw ?.code.startupxor ax,ax;被加數(shù)AX清0mov cx,

26、100again:add ax,cx;從100,99,.,2,1倒序累加loop againmov sum,ax;將累加和送入指定單元.exit 0end例4.5 求和 計(jì)數(shù)控制循環(huán) 循環(huán)次數(shù)固定“冒泡法”是一種排序算法,不是最優(yōu)的算法,但它易于理解和實(shí)現(xiàn)冒泡法從第一個(gè)元素開始,依次對(duì)相鄰的兩個(gè)元素進(jìn)行比較,使前一個(gè)元素不大于后一個(gè)元素;將所有元素比較完之后,最大的元素排到了最后;然后,除掉最后一個(gè)元素之外的元素依上述方法再進(jìn)行比較,得到次大的元素排在后面;如此重復(fù),直至完成就實(shí)現(xiàn)元素從小到大的排序這需要一個(gè)雙重循環(huán)程序結(jié)構(gòu)圖示例4.6 冒泡法冒泡法的排序過程序號(hào) 數(shù)比 較 遍 數(shù)1234 1 32 2 85 3 16 4 15 5 8321615885161583285158163285815163285第4章 data segment array db 32d,85d,16d,15d,8d data ends prognam segment assume cs:prognam,ds:data start: mov ax,data ;將data數(shù)據(jù)段地址 mov ds,ax ;送往d

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論