Ch 25 FPU (4) IEEE »P BCD

³o¤@³¹¤p¤ì°¸±N¤¶²Ð¨â­Ó¦³¥Îªº°Æµ{¦¡¡A¤@­Ó¬O¥i¥H§â FPU ªº°ïÅ|³»ª½±µ¦L¦b¿Ã¹õ¤W (µù¤@)¡A¥t¤@­Ó¬O¥i¥H±µ¨ü ASCII ªü©Ô§B¼Æ¦r¦r¦ê¨Ã¦s¤J FPU °ïÅ|³»¡C

¬°¤F¤F¸Ñ§â°ïÅ|³»¼Æ­È¦L¦b¿Ã¹õ¤W¡A¥²¶·¥ý»¡©ú¤°»ò¬O¡y¬ì¾Ç°O¸¹¡z¡H¡y¬ì¾Ç°O¸¹¡z¬O¤@ºØ¥i¥Hªí¥Ü«Ü¤j©Î«Ü¤p¼Æªº¤@ºØªí¥Ü¤èªk¡A¥ô¦ó¼Æ§¡¥i¥H¤Æ¦¨

a¡Ñ10x

³o­Ó°O¸¹¡Aa¡Ñ10x¡A´NºÙ¬°¡y¬ì¾Ç°O¸¹¡z¡A¨ä¤¤ a ¥²¶·¦b 1 ©M 10 ¤§¶¡¡A¥i¥Hµ¥©ó 1 ¦ý¤£¯àµ¥©ó 10¡A¦Ó x ¬O¾ã¼Æ¡A¥i¥H¬O¥¿¼Æ¡B­t¼Æ©Î¹s¡C¦Ü©ó a »P x ¤¤¤å¦p¦óºÙ©I¡H¤p¤ì°¸¤£ª¾¹D¡A¦ý¤U¤å­n¥Î¨ì¡A©h¥BºÙ¥¦­Ì¬°¡y¦³®Ä¼Æ¡z»P¡y¦¸¤è¼Æ¡z¡C¨Ò¦p¡G

       1 = 1¡Ñ100
54000000 = 5.4¡Ñ107
0.000022 = 2.2¡Ñ10-5

²Ä¤T­Ó¨Ò¤l¡A2.2 ºÙ¬°¡y¦³®Ä¼Æ¡z¡A-5 ºÙ¬°¡y¦¸¤è¼Æ¡z¡C¡y¬ì¾Ç°O¸¹¡z¥Î¨Óªí¥Ü«Ü¤j©Î«Ü¤pªº¼Æ®É¡A«Ü¤è«K¦Ó¥B¤@¥Ø¤FµM¡A©Ò¥H¤p¤ì°¸«e­±©Ò´£¨ìªº¨â­Ó°Æµ{¦¡´N¬O§â FPU °ïÅ|³»¥H¬ì¾Ç°O¸¹ªí¥Ü¡A¥t¤@­Ó°Æµ{¦¡¬O¿é¤J¬ì¾Ç°O¸¹¦r¦ê¡AÂà´«¦¨ IEEE ®æ¦¡¦s©ó°ïÅ|³»¡C¦Ó¹ê»Ú¿é¤J®É 10 ªº¦¸¤è¼Æ¥Î¡yE¡zªí¥Ü¡A¨Ò¦p 2.3E2 §Y 2.3¡Ñ102¡C


IEEE Âà´«¦¨ ASCII ¦r¦ê¡Gieee_to_ascii_5c

­ì²z

­n§â FPU °ïÅ|³»¥H ASCII ¤å¦r¦r¦êªº¬ì¾Ç°O¸¹ªí¥Ü¥X¨Ó¡A¥²¶·¨D¥X¡y¦³®Ä¼Æ¡z©M¡y¦¸¤è¼Æ¡z¡C¦b FPU «ü¥O¤¤¦³¤@­Ó FBSTP «ü¥O¥i¥H§â IEEE ®æ¦¡ªº¾ã¼ÆÂà´«¦¨»E¶° BCD ¼Æ¡A¥»µ{¦¡´N¬O·Q¿ìªk§â¡y¦³®Ä¼Æ¡zÂà´«¦¨¾ã¼Æ¡A¦Ó¦¸¤è¼Æ¥²©w¬O¾ã¼Æ¡A¦A¥Î FBSTP «ü¥O¦s¦¨»E¶° BCD ¼Æ¡A¦A½Õ¾ã¦³®Ä¼Æªº¤p¼ÆÂI¦ì¸m´N¦¨¤F¡C

¦¸¤è¼Æªº¨Dªk¨Ã¤£Ãø¡A§Q¥Î¥H 10 ¬°©³ªº¹ï¼Æ«Ü®e©ö´Nºâ¥X¨Ó¤F¡C

log10(a¡Ñ10x) = log10a + log1010x = log10a + x

¨ä¾ã¼Æ³¡¥÷´N¬O¦¸¤è¼Æ¡A¦ý¬O x87 «ü¥OùبèS¦³¨D¥H 10 ¬°©³ªº¹ï¼Æ­È¡A¥u¦³¨D¥H 2 ¬°©³ªº¹ï¼Æ­È¡A§Y FYL2X¡A¤£¹LÁÙ¦n¤p¤ì°¸ÁÙ°O±o°ê¤¤¦Ñ®v±Ðªº¡A¥Î¡y´«©³¤½¦¡¡z¥i¥H­pºâ¥X¨Ó¡A´«©³¤½¦¡¬O¡G

´«©³¤½¦¡

´«¥y¸Ü»¡¡A¥u­n¥ý¨Ï ST(1) »P ST ¤§­È¤À§O¬O 1 »P­n¦b¿Ã¹õ¤WÅã¥Üªº¼Æ¡A¦A¥Î FYL2X «ü¥O§â ST Åܦ¨¥H 2 ¬°©³ªº¹ï¼Æ­È¡A¦A°£¥H Log210 ¡A³Ì«á¦A§âµ²ªG¦Û¾ã¼Æ±Ë¥h´N¥i±o¨ì¦¸¤è¼Æ¡C¨D¥X¦¸¤è¼Æ«á¦A¨D¦³®Ä¼Æ´N¤£Ãø¤F¡C¨ä¹ê±z¥i¥H·Q¹³¡A¦³®Ä¼Æ´N¬O­ì¨Óªº­È (­nÅã¥Ü¦b¿Ã¥ú¹õªº¼Æ) °£¥H 10 ªº¦¸¤è¼Æ¡C¤p¤ì°¸·QÁ|­Ó¨Ò¤l»¡©ú¡A¥i¯à·|§ó²M·¡¤@¨Ç¡C

°²¦p¦³¤@­Ó¼Æ 57923.8912 ­n§â¥¦Åܦ¨¬ì¾Ç°O¸¹¡AÅãµMµª®×¬O 5.79238912¡Ñ104¡A¦b¤p¤ì°¸ªºµ{¦¡ùجO¥ý­pºâ log1057923.8912¡A³o­Ó¹ï¼Æ­È¬O 4.762857729¡A¥u­n¨ú¾ã¼Æ³¡¥÷§Y¬°¦¸¤è¼Æ¡C§â­ì¨Óªº¼Æ°£¥H 104 ´N±o¨ì¦³®Ä¼Æ 5.79238912 ¤F¡C¥u¤£¹L³o¼Ëºâ¥X¨Óªº¦³®Ä¼Æ¤´¬O¸g¹L½s½Xªº IEEE ®æ¦¡¡A¦ý¬O¦pªG­¼¥H 1017¡A´N¥i¥HÅܦ¨¾ã¼Æ¡A¦A¥Î FBSTP ³o­Ó«ü¥Oª½±µ§â¥¦¥H packed BCD ªº®æ¦¡¦s¤J°O¾ÐÅ餤¡A³o¼Ë´N«Ü®e©öÅܦ¨¥Î ASCII ®æ¦¡¤F¡C

¬°¦ó­n­¼¥H 1017 ©O¡H­ì¨Ó¬O¥H FBSTP ¦s¤Jªº¾ã¼Æ³Ì¤j¦³ 18 ¦ì¡A¦Ó¦©±¼­Ó¦ì¼Æ¡A©Ò¥H­¼¥H 1017 ´N¨¬¥HÀ³¥I¤F¡C

­ì©l½X

©M«e¤@³¹¤@¼Ë¡A­n²ÕĶ¦¨ COM Àɪºµ{¦¡½X©M EXE ¤£¦P¡C¦Ó²ÕĶµ¹ EXE ¥Îªº°Æµ{¦¡ºÙ¬° ieee_to_ascii_5x¡A¥u¯à³Q EXE ÀÉ©I¥s¡A²ÕĶµ¹ COM ÀɥΪºµ{¦¡ºÙ¬° ieee_to_ascii_5c¡A¯à³Q EXE ÀÉ©Î COM ÀÉ©I¥s¡C¦¹³Bªº 5 ¬O«üµ¹ Pentium µ¥¯Å©Î¤Î¨ä¥H¤Wªº CPU ¨Ï¥Îªº°Æµ{¦¡¡C©³¤U¬O ieee_to_ascii_5c ªº­ì©l½X¡G

        .286
        .8087
;***************************************
code    segment byte
        assume  cs:code,ds:code
        public  ieee_to_ascii_5c
        extrn   x_p_y_5c:near
;---------------------------------------
;¥Øªº¡G¦¹°Æµ{¦¡¬O±N 8087 ST ¼È¦s¾¹¤º¤§¹ê¼Æ¡AÂà´«¦¨
;      ASCII ¼Æ¦r¦r¦ê¤§®æ¦¡,¨Ã¦s©óDS:BX©Ò«ü©wªº¦ì§}
;      «ØÀÉ©ó1990.05.15 20:21 ­×§ï©ó 1998.03.25 am
;¿é¤J¡GST - ±ýÂà´«¤§¹ê¼Æ
;      DS:BX - ¦r¦êÀx¦s¦ì§}¡A¥²»Ý¦³ 26 bytes,¤j¦ì¼Æ©ó§C¦ì§}
;¿é¥X¡GST - ±ýÂà´«¤§¹ê¼Æ
;      DS:BX - ASCII ®æ¦¡ªº¼Æ¦r¦r¦ê¡A¤j¦ì¼Æ©ó§C¦ì§}
ieee_to_ascii_5c        proc    near
        push    si
        call    realad
addrad  equ     this word
realad: pop     si
        sub     si,offset addrad
        ftst                    ;022 ¦] Log2 0 ·|³y¦¨µL·N¸q¡A¬G¥ý´ú¸Õ¬O§_¬°0
        push    ax
        fstsw   cs:sw[si]
        fwait
        mov     ax,cs:sw[si]    ;--st0--;--st1--;--st2--;026
        sahf                
        fld     st              ;   x   ;   x   ;       ;028 °²³]­n¦L¥Xªº¼Æ¬° x
        jne     non_z
;030 ST¬°0®É,exp©Mmans§¡¬°0
        fbstp   cs:exp[si]      ;   x   ;
        fld     st              ;   x   ;   x   ;
        jmp     short ok_z
;034 ST ¤£¬°¹s®É¡A¥ý­pºâ¥X«ü¼Æ¬°¦ó
non_z:  fabs                    ;  |x|  ;   x   ;
        fld1                    ;   1   ;  |x|  ;   x   ;039
        fxch    st(1)           ;  |x|  ;   1   ;   x   ;037
        fyl2x                   ;log2|x|;   x   ;
        fldl2t                  ;log2 10;log2|x|;   x   ;039
        fdivp   st(1),st        ;e=log x;   x   ;        040 «ü¼Æ¬°¡yeªº¾ã¼Æ³¡¥÷¡z
        fstcw  cs:cw[si]                ;041 «O¦s²{¦³±Ë¤J¤èªk
        fwait
        push    cs:cw[si]
        and     cs:cw[si],not 0c00h     ;044 §ó§ï±Ë¤J¤èªk¬°¡y¦V­tµL½a¤j¡z±Ë¤J
        or      cs:cw[si],0400h
        fldcw   cs:cw[si]               ;046 ¸ü¤J·sªº±Ë¤J¤èªk
        frndint                 ;i=int e;   x   ;       ;047 §â e ±Ë¤J¦¨ i
        pop     cs:cw[si]                               ;    i §Y¬°«ü¼Æ³¡¥÷
        fldcw   cs:cw[si]                               ;049 ¦s¦^ªº±Ë¤J¤èªk
        fld     st              ;   i   ;   i   ;   x
        fbstp   cs:exp[si]      ;   i   ;   x   ;       ;051 §â i ¦s¤J exp ÅܼÆùØ
        fchs                    ;  -i   ;   x   ;
        fild    cs:ten[si]      ;   10  ;  -i   ;   x   ;053 ¸ü¤J 10
        call    x_p_y_5c        ;  10-i ;   x   ;
        fmul    st,st(1)        ; x/10i ;   x   ;
        fmul    cs:ten17[si]    ;  sig  ;   x   ;       ;056 sig ¬°¡y¦³®Ä¼Æ¡z
ok_z:   fbstp   cs:mans[si]     ;   x   ;

;059 ±Nmans,exp¤§packed BCDÂà´«¦¨ASCII¼Æ¦r¦r¦ê
        cld
        push    di              ;061 ¦s¤J­ì¼È¦s¾¹
        push    bx
        push    es
        mov     di,bx           ;065 DI=IEEE¼ÆÂà´«¦¨ASCII«áªº¦s©ñ¦ì§}
        push    ds
        pop     es              ;066 ¨Ï ES=DS
        mov     bx,offset mans+9
        add     bx,si           ;068 BX=¡y¦³®Ä¼Æ¡z³Ì°ª¦ì§}
        mov     al,cs:[bx]      ;069 AL=¡y¦³®Ä¼Æ¡zªº¥¿­t¸¹
        call    set_sign
        dec     bx              ;071 BX=¡y¦³®Ä¼Æ¡zªº¦¸°ª¦ì§}¡A¦¹¦ì§}¬°¼Æ­È¶}©l
        mov     al,cs:[bx]      ;072 AL=¡y¦³®Ä¼Æ¡zªº²Ä¤@¦ì»P²Ä¤G¦ì
        mov     ah,al
        and     al,0f0h         ;074 ¥ý³B²z AL ªº¸û¤j¦ì¼Æ
        shr     al,4
        call    set_nibble
        mov     al,'.'          ;077 ¦s¤J¤p¼ÆÂI
        stosb
        mov     al,ah           ;079 ¦A³B²z AL ªº¸û¤p¦ì¼Æ
        call    set_nibble
        push    cx
        dec     bx              ;082 ¦A³B²z¨ä¥L 16 ¦ì¼Æ
        mov     cx,8
agin0:  call    set_byte
        loop    agin0
        mov     al,'E'          ;086 ¦s¤J¡yE¡z
        stosb
        mov     bx,offset exp+9
        add     bx,si           ;089 BX=«ü¼Æ³Ì°ª¦ì§}
        mov     al,cs:[bx]      ;090 AL=«ü¼Æªº²Å¸¹
        call    set_sign
        mov     cx,2            ;092 «ü¼Æ³Ì¦h¦ì¼Æ¬°¥|¦ì¼Æ
        sub     bx,8            ;093 BX=¸õ¹L¹s«áªº«ü¼Æ³Ì°ª¦ì§}
agin1:  call    set_byte
        loop    agin1
        pop     cx
        pop     es
        pop     bx
        pop     di
        pop     ax
        pop     si
        ret

;104 ³]©w¥¿­t¸¹
set_sign:       or      al,al
                mov     al,'+'
                jz      positive
                mov     al,'-'
positive:       stosb
                ret

;112 ¸Ñ¶} AL ªº packed BCD ¼Æ¡A¨Ã¦s¤J DI ©Ò«üªº¦ì§} 
set_byte:       mov     al,cs:[bx]
                mov     ah,al
                shr     al,4
                call    set_nibble
                mov     al,ah
                call    set_nibble
                dec     bx
                ret
                
set_nibble:     and     al,0fh
                add     al,'0'
                stosb
                ret

;127 ¸ê®Æ°Ï
mans    dt      0
exp     dt      0
ten17   dq      1.0E17
ten     dw      10
cw      dw      ?       ;±±¨î¦r²Õ
sw      dw      ?       ;ª¬ºA¦r²Õ
ieee_to_ascii_5c        endp
;---------------------------------------
code    ends
;***************************************
        end     ieee_to_ascii_5c

³o­Óµ{¦¡¥i¥H§â¥¦¦s¦¨ IEEE2A5C.ASM µM«á²ÕĶ¨Ã¥[¤Jµ{¦¡®w¡AMYASMLIB.LIB¡C


·sªº«ü¥O

.286

³o­Ó«ü¥O¬Oªí¥Ü¥i¥H¨Ï¥Î 80286 ·s¼Wªº«ü¥O¶°¡C¦b³o­Óµ{¦¡ùØ²Ä 75 ¦æ¥X²{¡yshr al,4¡z³o¤@±ø«ü¥O¥u¯à¦b 80286 ¤Î¨ä¥H¤Wµ¥¯Åªº CPU ¨Ï¥Î¡A¦pªG¬O¦b 8087 ¨Ï¥Î¥²¶·§ï¦¨

mov     cl,4
shr     al.cl

NOT

³o¬O¤@­ÓÅÞ¿è¹Bºâ«ü¥O¡A¥¦ªº·N«ä¬O¡y«D¡z¹Bºâ¡A·N«ä¬O§â 0 Åܦ¨ 1¡A1 Åܦ¨¹s¡A¦b²ÕĶ®É¡AMASM ´N·|¦Û°Êºâ¥X¯u¹ê¼Æ­È¬O¦h¤Ö¡A¦Ó¼g¤J¥ØªºÀÉ¡C¨Ò¦p¥»µ{¦¡ªº²Ä 44 ¦æ¡Anot 0c00h¡A¤p¤ì°¸¬°»¡©ú¤è«K¥ý§â 0c00h ´«¦¨¤G¶i¦ì¬O 0000 1100 0000 0000¡Anot ¹Bºâ¬O§â 0 Åܦ¨ 1¡A1 Åܦ¨¹s¡A©Ò¥H not 0c00h ´NÅܦ¨ 1111 0011 1111 1111¡A§Y 0f3ffh¡C( ¨ä¹ê not 0c00h= 0f3ffh )

FSTCW/FLDCW Àx¦s/¸ü¤J±±¨î¦r²Õ

¥ý»¡»¡ FSTCW «ü¥O¡A³o­Ó«ü¥O¬O§â FPU ¤Wªº¡y±±¨î¦r²Õ¡zªº¤º®eÀx¦s¨ì¤@­Ó 16 ¦ì¤¸ªº°O¾ÐÅéÅܼƤ¤¡A¦³Ãö±±¨î¦r²Õªº¸Ô²Ó»¡©ú½Ð°Ñ¾\ªþ¿ý¤G±±¨î¦r²Õ¡C

FLDCW ¬O§â¤@­Ó 16 ¦ì¤¸°O¾ÐÅéÅܼƸü¤J¨ì FPU ªº±±¨î¦r²Õ¤¤¡C³o­Ó 16 ¦ì¤¸°O¾ÐÅéÅܼƤ§¼Æ­È±N·|§ïÅÜ FPU ªº¨Ò¥~±ø¥óªº³B²z¡B¦p¦ó±Ë¤J¡B±±¨î¹ê¼Æºë½T«×µ¥µ¥¾Þ§@¡C


ieee_to_ascii_5c ÃöÁä¹Lµ{»¡©ú

¤p¤ì°¸±N»¡©ú³o­Óµ{¦¡ªº´X­ÓÃöÁä¹Lµ{¡G¨D¦¸¤è¼Æªº±Ë¥h¡B¨D¦³®Ä¼Æ¡C

¨D¦¸¤è¼Æªº±Ë¥h

¦b¥»µ{¦¡¤¤¡A­n¨D¬Y¼ÆªºÅܦ¨¬ì¾Ç°O¸¹®É¡A10 ªº¦¸¤è¼Æ¬O¦h¤Ö¡H³Ì²³æªº¤èªk¬O¨ú¨ä±`¥Î¹ï¼Æ­È¡CÁ|¨Ò¨Ó»¡¡G1234=1.234¡Ñ103¦¸¤è¼Æ¬O 3¡A¦Ó Log 1234=3.091315¡A¨ú¨ä¾ã¼Æ³¡¥÷´N¬O10 ªº¦¸¤è¼Æ¤F¡C¦A¬Ý¥t¤@­Ó¨Ò¤l¡A0.00222=2.22¡Ñ10-3¡A¦¸¤è¼Æ¬O -3¡A¦Ó Log 0.00222=-2.653647¡A¦pªG¥u¨ú¾ã¼Æ³¡¥÷¡AÅãµM¬O¤£¹ïªº¡A¦ý¬O¦pªG¡y¦V­tµL½a¤j±Ë¥h¡zµ²ªG´N¦¨¬° -3¡A¤]´N¬O¤Qªº¦¸¤è¼Æ¤F¡C¦Ó«e¤@­Ó¨Ò¤l¡A¦V­tµL½a¤j±Ë¥h¤]±o¨ì¥¿½Tªºµ²ªG¡A©Ò¥H¥»µ{¦¡¤¤±Ë¥h¤è¦¡¬O¡y¦V­tµL½a¤j±Ë¥h¡z¡C

­n¨Ï FPU ¦V­tµL½a¤j±Ë¥h¡A¥²¶·§ïÅܱ±¨î¦r²Õ¡C²Ä 41 ¦æ¥ý¥Ñ FSTCW ¨ú±o±±¨î¦r²Õ¤§¸ê®Æ¦s©ó cw ÅܼƤ¤¡A³o¬O¦]¬°§Ú­Ì¨S¦³Åܪk¹ï±±¨î¦r²Õª½±µ¹Bºâ¡C¦A¬dªþ¿ý¤G±±¨î¦r²Õ±oª¾¡A­n¨Ï FPU ¦V­tµL½a¤j±Ë¥hÀ³¨Ï²Ä 10¡B11 ¦ì¤¸¤À§O¬° 0¡B1¡A©Ò¥H¦b²Ä 44 ¦æ¥ý¨Ï cw ªº²Ä 10¡B11 ¦ì¤¸§¡§O¬° 0 ( ¹ï­ì±±¨î¦r²Õ¤§¸ê®Æ°µ and 0f3ffh ¹Bºâ )¡A¦A¨Ï²Ä 10 ¦ì¤¸Åܬ° 1 ( ¹ï±±¨î¦r²Õ¤§¸ê®Æ°µ or 400h ¹Bºâ )¡C³Ì«á¦A¥Î FLDCW «ü¥O¨Ï·sªº cw ¸ü¤J¨ì FPU ùتº±±¨î¦r²Õ¡A³o¼Ë FPU °µ±Ë¥h°Ê§@®É´N·|¦V­tµL½a¤j±Ë¥h¤F¡C

¨D¦³®Ä¼Æ

¤p¤ì°¸·QÁÙ¬OÁ|¨Ò»¡©ú¦n¤F¡C¨Ò¦p 1234.567=1.234567¡Ñ103¡A¦³®Ä¼Æ¬O 1.234¡AÁöµM FBSTP ¥i¥H§â IEEE ¦ý¬O«e´£¥²¶·¬O¨Ï°ïÅ|³»¬°¾ã¼Æ¡A§_«h·|¦Û¤p¼ÆÂI¥H¤U±Ë¥h¡C¦p¦ó¨Ï¨ä¬°¾ã¼Æ©O¡H·íµM´N¬O­¼¥H 10¡B100¡B1000¡B10000¡K¡K¡A¦ý¬O­n­¼¥H¨º¤@­Ó±o¬Ý¤p¼Æ¦ì¼Æ¦Ó©w¡A³o¼Ë«Ü³Â·Ð¡A¤p¤ì°¸¦³­Ó¶¡±µªº¤èªk¡A´N¬O¥ý°£¥H¸Ó¼Æªº 10 ªº¦¸¤è¼Æ¡A¦A­¼¥H 1017¡A¬°¦ó­¼¥H 1017 ©O¡H­ì¦]¬O FBSTP ¥i¥H¦³ 18 ¦ì¼Æ¡C¨Ò¦p³o­Ó¨Ò¤l¡A1234.567 ¥ý°£¥H 1000¡AÅܦ¨ 1.234567¡A¦A­¼¥H 1017 Åܦ¨ 123456700000000000¡A³o¬O¤@­Ó«Ü¤jªº¾ã¼Æ¡A§â¥¦¥Î FBSTP «ü¥O¥H»E¶° BCD ¼Æ¦s¤J mans ÅܼƤ¤¡A¦Ó¤p¼ÆÂIªº¦ì¸m¦b²Ä¤@¦ì¼Æ¦r¤§«á¡C

FBSTP ¦s¤J®É¡A¥²¶·¥ý³]¤@­Ó 10 ¦ì¤¸²Õªº°O¾ÐÅéÅܼơA¤]´N¬O mans¡A³Ì°ª¦ì§}ªº¨º¤@­Ó¦ì¤¸²Õ¥u¦³²Ä 7 ¦ì¤¸¬Oªí¥Ü²Å¸¹¡A¨ä¥L²Ä 0 ¨ì²Ä 6 ¦ì¤¸³£¨S¦³¨Ï¥Î¡C¦Ó«á¦@¦³¤E­Ó¦ì¤¸²Õ¡A¥i¥Hªí¥Ü 18 ¦ìªº»E¶° BCD ¼Æ¡C­ì©lµ{¦¡ªº²Ä 59 ¦æ¨ì²Ä 125 ¦æ´N¬O®Ú¾Ú¤W­z½s½X¤è¦¡¡A¸Ñ¶}³o­Ó»E¶°ªº BCD ¼Æªºµ{¦¡¡C


ASCII ¦r¦êÂà´« IEEE¡Gascii_to_ieee_5c

³o­Ó°Æµ{¦¡¬O¥Î¨Ó§â¤@­Ó¦r¦êÅܦ¨ IEEE ¹ê¼Æ®æ¦¡¡A¨Ã¦s©ó ST ¼È¦s¾¹¤¤¡C¦Ó³o­Ó¦r¦ê¥i¥H¬O ASCII ½s½Xªºªü©Ô§B¼Æ¦r¡A©Î¬O«D»E¶°ªº BCD ¼Æ¦r¡A¦ý¬O³£¥²¶·¥HÂk¦ì¦r¤¸ (0DH) °µ¬°µ²§À¡A¥B¤j¦ì¼Æ¦b§C¦ì§}¡C

¤p¤ì°¸¬°¤°»ò­n¼g³o­Óµ{¦¡©O¡H­ì¨Ó·í¨Ï¥ÎªÌ¥HÁä½L¿é¤J¼Æ¦r®É¡A¨ä¹ê¨C«ö¤U¤@­ÓÁä¡A¹q¸£±N¨ä±½´y½X»P ASCII ½X°O¿ý©ó°O¾ÐÅ餤¦¨¬°¦r¦ê¡A¦ý³o¨Ç¦r¦êµLªk¬° FPU ¥ß§Y¹Bºâ¡A§Y¨Ï¬O CPU ¤]¥u¯à°µ»E¶°©Î«D»E¶°ªº BCD ¹Bºâ¡A©Ò¥H¤p¤ì°¸¨Ì·Ó AH=0AH/INT 21H ©Ò¿é¤J¦r¦ê®æ¦¡¡A¼g¤F³o­Ó°Æµ{¦¡¡A§â¦r¦ê¤Æ¦¨¹ê¼Æ¡C

³o­Ó°Æµ{¦¡©Ò¯à±µ¨üªº¦r¦ê¥]§t ASCII ¦r¦ê»P«D»E¶°ªº BCD ¼Æ¡A´«¥y¸Ü»¡ ASCII ¦r¤¸¥u­n¦b 30H ¨ì 39H ©Î¬O¼Æ¦r¦b 00H ¨ì 09H ³£¥i¥H¡A¦¹¥~¦r¦ê¥]§t¤p¼ÆÂI¡y.¡z(2EH) ©Î¬O¡yE¡z¡B¡ye¡z¤]¥i¥H³Q±µ¨üªº¡C¡yE¡z¡B¡ye¡z¬Oªí¥Ü¤Qªº´X¦¸¤èªº·N«ä¡C

­ì©lµ{¦¡

cr      equ     0dh
;***************************************
code    segment byte
        assume  cs:code,ds:code
;---------------------------------------
;¥Øªº¡G±N ASCII ¼Æ¦r®æ¦¡Âà´«¦¨ IEEE ¹ê¼Æ®æ¦¡¨Ã¦s©ó ST °ïÅ|¼È¦s¾¹
;¤é´Á¡G«Ø¥ß©ó1990.12.01 1:19,­×§ï©ó1998.04.07¡A2003.01.01
;¿é¤J¡GDS:BX - ASCII ¼Æ¦r¦r¦ê©Î«D»E¶° BCD ¼Æ°_©l¦ì§}¡A¦¹¼Æ¦r¦r¦êªº¸û¤j¼Æ¦b§C¦ì§}¡A
;              ¥B¥H 0dh ¦r¦êµ²§ô²Å¸¹¡A¨Ò¦p¡G01 02 03 2E 04 45 02 0D ªí¥Ü 123.4E2
;              ©Î 31 32 33 2E 34 65 32 0D ªí¥Ü 123.4E2¡A³£¬O¥i¥H±µ¨üªº®æ¦¡
;¿é¥X¡GCF - CY ¿ù»~¡FNC ¥¿±`
;      ST - ­Y¥¿±`«h IEEE ¹ê¼Æ¡F­Y¿ù»~«h­«³] FPU
        extrn   x_p_y_5c:near
        public  ascii_to_ieee_5c
ascii_to_ieee_5c        proc    near
        push    si              ;016 «O¦s SI
        call    real2           ;017 SI=¦¹°Æµ{¦¡©Ò»Ý¸ê®Æ¤§¯u¥¿¦ì§}
addr2   equ     this word
real2:  pop     si
        sub     si,offset addr2

        push    ax              ;022 «O¦s AX¡BBX
        mov     cs:byte ptr status[si],0        ;023 ³]©w¨S¦³¤p¼ÆÂI¡BE¡B¦³®Ä¼Æ
        push    bx
        cmp     byte ptr [bx],cr                ;025 Àˬd¬O§_¬°ªÅ¦r¦ê¡A¤Î¨Ï¥ÎªÌ
        jz      zero                            ;    ¶È¿é¤J¤@­Ó 0DH
        call    sign            ;   s   ;       ;027 ¨ú±o¦³®Ä¼Æ¥¿­t¸¹
        call    get_num         ;   m   ;       ;028 ­pºâ¦³®Ä¼Æ¼Æ­È
        jc      error
        cmp     al,cr
        jz      ok

        and     cs:byte ptr status[si],0fdh
        call    sign            ;   s   ;   m   ;034 ¨ú±o 10 ªº¦¸¤è¼Æ¤§¥¿­t¸¹
        call    get_num         ;   e   ;   m   ;035 ­pºâ 10 ªº¦¸¤è¼Æ¼Æ­È
        jc      error
        fild    cs:ten[si]      ;  10   ;   e   ;   m   ;
        call    x_p_y_5c        ; 10^e  ;   m   ;
        fmulp   st(1),st        ;m*10^e ;       ;039 ±o¨ì m*10^e ©ó ST
ok:     clc                     ;040 ¥¿±`µ²§ô
exit:   pop     bx
        pop     ax
        pop     si
        ret

zero:   fldz            ;046 ¨Ï¥ÎªÌ¥u¿é¤J¤@­Ó 0DH
        jmp     ok

error:  stc             ;044 ¿ù»~µ²§ô
        finit
        jmp     exit
;---------------------------------------
;053 ¨ú±o¥¿­t¸¹¤§°Æµ{¦¡
sign:   mov     al,[bx]
        fld1                    ; s=+1  ;
        cmp     al,'-'
        jz      sign_m
        cmp     al,'+'
        jz      sign_p
        ret
sign_m: fchs                    ; s=-1  ;
sign_p: inc     bx
        ret
;---------------------------------------
;065 Àˬd AL ¬O§_¦b 0-9 ©Î 30H-39H ¤§¶¡¡A­Y¬O«h NC ¨Ã¨Ï AL ¦b 0-9¡F­Y§_«h CY
check:  cmp     al,9
        jb      num
        sub     al,'0'
        jb      non_n
        cmp     al,9
        ja      non_n
num:    clc
        ret
non_n:  stc                     ;074 ¿é¤J¦r¦ê§t«D¼Æ¦r¡A¿ù»~
        ret
;076 ¸ê®Æ°Ï---------------------------------------------------------------------
x       dw      ?       ;FPU ¥u¯à¥Ñ°O¾ÐÅé¸ü¤J¼Æ­È¡A¨C¤@¦ì¼Æ¼È®É¦s©ñ¦¹³B¦A¸ü¤J FPU
ten     dw      10      ;±`¼Æ 10
status  db      ?       ;bit0=0 µLE²Å¸¹  bit1=0 µL¤p¼ÆÂI  bit2=0 µL¦³®Ä¼Æ
;                             1 ¦³E²Å¸¹       1 ¦³¤p¼ÆÂI       1 ¦³¦³®Ä¼Æ
;-------------------------------------------------------------------------------
get_num:                                        ;082 ­pºâ¼Æ­È¤§°Æµ{¦¡
        fldz                    ;  i=0  ;   s   ;083 ¥ý¸ü¤J 0
n0:     cbw                                     ;084 ¨Ï AH=0¡A¥H«K¦s¤J x ÅܼÆ
        mov     al,[bx]
        cmp     al,cr
        jz      n2
        cmp     al,'E'
        je      n1
        cmp     al,'e'
        je      n1
        cmp     al,'.'
        je      n6
        call    check
        jnc     n7
        jmp     short n5

;098 ³B²z¿é¤J¦r¦ê¤¤§t¬ì¾Ç°O¸¹ E ¤§µ{¦¡¤ù¬q
n1:     test    cs:status[si],1         ;099 Àˬd¬O§_¤w¸g¦³¡yE¡z¤F
        jnz     n5
        or      cs:status[si],1         ;101 ÁÙ¥¼¦³¡yE¡z¡A¥¿½T

;103 ³B²zµ²§À²Å¸¹ 0DH
n2:     test    cs:status[si],0fh
        jz      na
        test    cs:status[si],2
        jz      n3                              ;107 ¦p¦³¤p¼ÆÂI¶·¥ý±N t ¼u¥X
        fcomp   st(1)           ;   i   ;   s   ;108 ¼u¥X t
n3:     test    cs:status[si],4                 ;109 Àˬd¦r¦ê¬O§_¨S¦³¦³®Ä¼Æ
        jnz     short n4
        fcomp   st              ;   s   ;       ;111 ­YµL¦³®Ä¼Æ¡A«h³]¦³®Ä¼Æ¬° 1
        fld1                    ;  i=1  ;   s   ;
n4:     fmulp   st(1),st        ; m=i*s ;       ;113 ¨Ï¦³®Ä¼Æ­È»P¥¿­t¸¹¬Û­¼
        inc     bx
        clc
        ret
n5:     stc
        ret

;120 ³B²z¦r¦ê¤¤§t¤p¼ÆÂIªºµ{¦¡¤ù¬q
n6:     test    cs:status[si],2         ;121 Àˬd¬O§_¤w¸g¦³¤p¼ÆÂI
        jnz     n5
        or      cs:status[si],6         ;123 ÁÙ¥¼¦³¤p¼ÆÂI
        fld1                    ;   1   ;   i   ;   s   ;124 ST=0.1¡A¥H«á¨C¼W¤@
        fidiv   cs:ten[si]      ; t=0.1 ;   i   ;   s   ;    ¦ì¤p¼Æ¡At Åܬ°­ì¨Ó
        jmp     short n9                                ;    ªº¤Q¤À¤§¤@

;128 ³B²z¦r¦ê¤¤ªº¡y¼Æ¡zªºµ{¦¡¤ù¬q
n7:     mov     cs:x[si],ax             ;129 ¦s¤J¼È®É¦s©ñ³B
        or      cs:status[si],4         ;130 ³]©w¦³¦³®Ä¼ÆºX¼Ð
        test    cs:status[si],2         ;131 Àˬd¦¹¦ì¼Æ¬°¾ã¼Æ³¡¥÷©Î¤p¼Æ³¡¥÷
        jnz     n8
;133 ¨S¿é¤J¤p¼ÆÂI¡A¬G¬°¾ã¼Æ³¡¤À
        fimul   cs:ten[si]      ; i=10i ;   s   ;       ;134 ¨C¼W¥[¤@¦ì¼Æ¡A
        fild    cs:x[si]        ;   x   ;   i   ;   s   ;    ­ì¼ÆÅÜ 10 ­¿
        faddp   st(1),st        ;i=10i+x;   s   ;       ;136 ¥[¤W·s¼Wªº¤@¦ì¼Æ
        jmp     short n9
;138 ¤w¿é¤J¤p¼ÆÂI¡A¬G¬°¤p¼Æ³¡¤À
n8:     fld     st              ;   t   ;   t   ;   i   ;   s
        fimul   cs:x[si]        ; x=x*t ;   t   ;   i   ;   s   ;140 ·s¼W¤@¦ì¤p¼Æ
        faddp   st(2),st        ;   t   ; i=x+i ;   s   ;
        fidiv   cs:ten[si]      ;t=t/10 ;   i   ;   s
n9:     inc     bx
        jmp     n0

na:     fcomp   st
        fldz
        jmp     n4
ascii_to_ieee_5c        endp
;---------------------------------------
code    ends
;***************************************
        end     ascii_to_ieee_5c

§â¥¦¼g¦n«á¦s¤J A2IEEE5C.ASM¡A²ÕĶ¦n¨Ã¥[¤Jµ{¦¡®w¡AMYASMLIB.LIB¡C

ascii_to_ieee_5c µ{¦¡»¡©ú

°²·Q¡A±z²{¦b¬O¤@­Ó¨Ï¥ÎªÌ¡A­n¿é¤J¤@­Ó¼Æ¦r¡A³o­Ó¼Æ¦r¥i¯à¬O¹³¡y12345¡z³o¼Ëªº¾ã¼Æ¡A¤]¥i¯à¬O¹³¡y0.003¡z©Î¬O¹³¡y-88.88¡z©Î¬O¹³¡y6.02¡Ñ1023¡z³o¼Ëªº¼Æ¡A©Ò¥H³o­Ó°Æµ{¦¡±o¦Ò¼{¨ì©Ò¦³¨Ï¥ÎªÌ¥i¯à¿é¤Jªº±¡ªp¡C

¬°¤F²¤Æµ{¦¡¡A·í¨Ï¥ÎªÌ¿é¤J¹³¡y6.02¡Ñ1023¡z³o¼Ëªº¼Æ®É¡A10 ªº´X¦¸¤è¬O¥Î¡yE¡z¨Óªí¥Ü¡A¦Ó¦b¡yE¡z¤§«e»P¡yE¡z¤§«á³£À³¸Ó¬O¼Æ¦r¡A©Ò¥H¤p¤ì°¸³]¥ß¤@­Ó°Æµ{¦¡¡Aget_num¡A¨Ó¨ú±o¼Æ¦r³¡¥÷¡A³o¼Ë¦b¨ú±o¦³®Ä¼Æ©Î 10 ªº¦¸¤è¼Æ³£¥u©I¥s get_num ´N¥i¥H¤F¡C¦¹¥~¦b¼Æ¦r¤§«e¤]¦³¥i¯à¥]§t¥¿­t¸¹¡A©Ò¥H¦b©I¥s get_num ¤§«e¥ý©I¥s sign °Æµ{¦¡¨Ó³]©w¥¿­t¸¹¡A¦pªG¬°¥¿¸¹©Î¨Ï¥ÎªÌ¨S¦³¿é¤J«h·|¦b ST ¦s¤J +1¡A¤Ï¤§«h¬° -1¡C

±µ¤U¨Ó¬O³o­Óµ{¦¡³Ì­«­nªº³¡¥÷¡A§Y¼Æ­Èªº¨ú±o¡A¤]´N¬O get_num ¨º¬qµ{¦¡¤ù¬q (²Ä 82 ¦æ¨ì²Ä 148 ¦æ)¡C³o¬qµ{¦¡¥D­n¥i¤À¬°¨â³¡¥÷¡A©Ò¿é¤Jªº¼Æ¦r¦r¤¸¬O¦b¾ã¼Æ³¡¥÷©Î¬O¦b¤p¼Æ³¡¥÷¡A°²¦p¬O¦b¾ã¼Æ³¡¥÷¡A«h­ì¥ýªº¼Æ¥²¶·Åܦ¨ 10 ­¿¡AµM«á¦A¥[¤W¸Ó¼Æ¦r¡F°²¦p¬O¦b¤p¼Æ³¡¥÷¡A«h­ì¥ýªº¼Æ­È¤£ÅÜ¡A¦Ó·s¥[¤Jªº¼Æ¦r­n¤ñÅܦ¨­ì¼Æ­Èªº³Ì¤p¦ì¼ÆÁÙ¤p¤Q¤À¤§¤@¡C

Á|¨Ò¨Ó»¡¡A¦pªG¨Ï¥ÎªÌ¿é¤J¡y1234.567¡z³o­Ó¦r¦ê¡A¦b°O¾ÐÅ餤¦ì§}¥Ñ§C¦Ó°ª¬O¡y31 32 33 34 2E 35 36 37 0D¡z¡A³Ì¥ý³B²zªº¬O¾ã¼Æ³¡¥÷ªº¡y1¡z¡A·í³B²z¨ì²Ä¤G¦ì¡A2¡A®É­ì¥ýªº 1 Åܦ¨ 10 ¦A¥[¤W 2¡A©ó¬O¦¨ 12¡A·í³B²z¨ì 3 ®É¡A­ì¥ýªº 12 ÅÜ 120 ¦A¥[¤W 3 ¦¨¬° 123¡K¡K¤@ª½¨ì¾ã¼Æ¼Æµ²§ô¡A¦bµ{¦¡²Ä 134 ¦æ´N¬O¨Ï­ì¼Æ­¼¥H 10¡C³B²z¤p¼Æ®É¡A²Ä¤@¦ì¡A5¡AÀ³¸Ó¬Ý¦¨ 0.1*5¡A²Ä¤G¦ì¡A6¡AÀ³¸Ó¬Ý¦¨ 0.01*6¡K¡K¡A©Ò¥H¤p¤ì°¸¦b²Ä 124¡B125 ¦æ³]©w 0.1¡A·í¨C·s¼W¤@¦ì®É¡A¥ý­¼¥H·s¼Wªº¼Æ (²Ä 140 ¦æ)¡A¦A¥[¨ì­ì¼Æ´N¥iºâ¥X¼Æ­È³¡¥÷¤F (²Ä 141 ¦æ)¡A³Ì«á¬°¤F¤U¤@¦ì¼Æ¹Bºâ¡AÁÙ­n§â 0.1 ¦A°£¥H 10(²Ä 142 ¦æ)¡C

¨ä¥L­È±o´£¤@´£ªº¤j·§¬O status ÅܼƤF¡A³o­ÓÅܼƬO¤p¤ì°¸¥Î¨Ó°O¿ý¡yºX¼Ð¡zªº¡C¥¦ªº¥\¥Î´NÃþ¦ü CPU ªººX¼Ð¡Cstatus ªº²Ä¹s¦ì¤¸¥Nªí¨Ï¥ÎªÌ¿é¤Jªº¦r¦ê¬O§_¥]§t¡yE¡z¦r¤¸¡A¤p¤ì°¸¥ý°²³]¨S¦³¡yE¡z¦r¤¸¡A¸Ó¦ì¤¸³]¬°¹s(²Ä23¦æ)¡A·íµ{¦¡Åª¨ú¨ì¡yE¡z®É¦A³]¸Ó¦ì¤¸¬°¤@(²Ä 101 ¦æ)¡A¦ý¬O¦pªG¨Ï¥ÎªÌ¿é¤J¨â­Ó©Î¨â­Ó¥H¤Wªº¡yE¡zÅãµM¬O¤£¦Xªkªº¼Æ¦r¡A©ó¬O¦AŪ¨ú¨ì¡yE¡z®É´N±oÀˬd¬O§_¤w¸g¦³Åª¹L¡yE¡z¤F(²Ä 99 ¦æ)¡A©ó¬O²£¥Í¿ù»~¡C

status ªº²Ä¤@¦ì¤¸¬O¥Î¨ÓÀˬd¤p¼ÆÂIªº¡A¤èªk¦P¤W¡A¤]¬O¥ý°²³]¨S¦³¿é¤J¤p¼ÆÂI¡A·í¹J¨ì¤p¼ÆÂI®É³]©w¦¹¦ì¤¸¬°¤@¡A¦A¹J¨ì¤p¼ÆÂI®É´N²£¥Í¿ù»~¡Cstatus ªº²Ä¤G¦ì¤¸¬O¥Î¨ÓÀˬd¨Ï¥ÎªÌ¬O§_¿é¤J¡y¦¸¤è²Å¸¹«e²@µL¥ô¦ó¼Æ¦rªº¦r¦ê¡z¡A¨Ò¦p¡yE02¡z³o¼Ëªº¦r¦ê¡A³oÃþ¦r¦êÀ³¸Ó¬O¬Ù²¤¦³®Ä¼Æ¡A1¡A³o­Ó°Æµ{¦¡±N¥¦¬Ý¦¨ 100¡C¤p¤ì°¸¥ý°²³]¸Ó¦ì¤¸¬°¹s¡Aªí¥Ü¨Ï¥ÎªÌ©Ò¿é¤Jªº¦r¦ê´N¬OÃþ¦ü¡yE02¡zªº³o¼Ë¦r¦ê¡A¦ý¬O¥u­n¦³¿é¤J¥ô¦ó¦³®Ä¼Æ­È¡A´N·|¨Ï¸Ó¦ì¤¸¬°¤@(²Ä123¡B130¦æ)¡F°²¦p³£¨S¦³¹J¨ì¦³®Ä¼Æ¦r¡A¨º¸Ó¦ì¤¸·|«O«ù¬°¹s¡A©Ò¥Hµ{¦¡ 109 ¨ì 112 ¦æÀˬd¬O§_¬O³o¼Ëªº±¡ªp¡A°²¦p¬O³oºØ±¡§Î¡A«h¦³®Ä¼Æ¥²¶·³]¬°¤@¡C


´ú¸Õ ieee_to_ascii_5c »P ascii_to_ieee_5c

¼g¦n³o¨â­Ó°Æµ{¦¡«á¡A¤p¤ì°¸¦A¼g­Óµ{¦¡¨Ó´ú¸Õ¥¦­Ì¡AºÙ¬° TSTIEEE.ASM (TST ¬O test ¤§·N)

;***************************************
code    segment
        assume  cs:code,ds:code
        org     100h
        extrn   ascii_to_ieee_5c:near
        extrn   ieee_to_ascii_5c:near
;---------------------------------------
start:  jmp     begin
string  db      50,0,50 dup (?)
num     db      0dh,0ah,26 dup (?),'$'
two     dw      2
mes     db      0dh,0ah,'Error!$'
begin:  mov     ah,0ah
        mov     dx,offset string
        int     21h
        finit
        mov     bx,offset string+2
        call    ascii_to_ieee_5c
        jc      error
        mov     bx,offset num+2
        call    ieee_to_ascii_5c
        mov     dx,offset num
        jmp     short pnt
error:  mov     dx,offset mes
pnt:    mov     ah,9
        int     21h
        int     20h
;---------------------------------------
code    ends
;***************************************
        end     start

¼g¦n¤§«á¡A¶i¦æ¤U­±²ÕĶ¡B³sµ²¡G

H:\HomePage\SOURCE>masm tstieee; [Enter]
Microsoft (R) Macro Assembler Version 5.00
Copyright (C) Microsoft Corp 1981-1985, 1987.  All rights reserved.


  51498 + 365446 Bytes symbol space free

      0 Warning Errors
      0 Severe  Errors

H:\HomePage\SOURCE>link tstieee [Enter]

Microsoft (R) Personal Computer Linker  Version 2.40
Copyright (C) Microsoft Corp 1983, 1984, 1985.  All rights reserved.

Run File [TA2I5C.EXE]: [Enter]
List File [NUL.MAP]: [Enter]
Libraries [.LIB]: myasmlib [Enter]
Warning: no stack segment

H:\HomePage\SOURCE>exe2bin tstieee tstieee.com [Enter]

H:\HomePage\SOURCE>ta2i5c [Enter]
123456 [Enter] ¡÷¿é¤J¼Æ¦r
+1.23456000000000000E+0005 ¡÷ TSTIEEE ¦L¥Xªº¬ì¾Ç°O¸¹
H:\HomePage\SOURCE>ta2i5c [Enter]
-0.000355 [Enter]¡÷¦A´ú¸Õ¤@¦¸
-3.55000000000000000E-0004

µù¤@¡G°£¤F¥»³¹ªºµ{¦¡¤§¥~¡A·íµM¤]¦³¨ä¥Lªº¤èªk§â IEEE ®æ¦¡ªº¼È®É¹ê¼ÆÂà´«¦¨ ASCII ¦r¦ê¡A¨Ò¦p SYMDEB ¥i¥HÅã¥Ü¦UºØ¹ê¼Æ®æ¦¡¡AÅãµM¨ä¤º¥²©w¥]§t¦¹ºØµ{¦¡ªºµ{¦¡½X¡A¤p¤ì°¸¤]¹Á¸Õ¹L°lÂÜ¥¦¡A¤]§ä¨ì¤F³o¬qµ{¦¡½X¡A½Ð°Ñ¦Òªþ¿ý¤K¡C


¦^¨ì­º­¶¡A ¨ì²Ä¤G¤Q¥|³¹¡A ¨ì²Ä¤G¤Q¤»³¹