<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 8086指令系統(tǒng)---串處理指令

          8086指令系統(tǒng)---串處理指令

          作者: 時間:2016-11-27 來源:網(wǎng)絡(luò) 收藏

          本文引用地址:http://www.ex-cimer.com/article/201611/322193.htm

          例編寫程序,傳輸20字節(jié)的字符串。

                DATSEG  SEGMENT
                DATAX   DB ABCDEFGHIJKLMNOPQRST
                DATAY   DB 20 DUP(?)
                DATSEG  ENDS
                ; - - - - - - - - - - - - - - - - - - - -
                CODSEG  SEGMENT
                ASSUME  CS:CODSEG,DS:DATSEG,ES:DATSEG
            START: MOV    AX,DATSEG
                MOV    DS,AX    ; initialize the data segment
                MOV    ES,AX    ; initialize the extra segment
                CLD          ; clear direction flag for autoincrement
                MOV    SI,OFFSET DATAX  ; load the source pointer
                MOV   DI,OFFSET DATAY  ; load the destination pointer
                MOV    CX,20    ; load the counter
                REP    MOVSB    ; repeat until CX becomes zero
                MOV   AX,4C00H  ; return to DOS
                INT    21H
            CODSEG ENDS
                END    START

            串傳送指令將SI所指示的數(shù)據(jù)段中的數(shù)據(jù)傳送到由DI指示的附加段中,本例將源串和目的串都設(shè)置在同一個段DATSEG中,因此,DS和ES都定義為DATSEG。

          例編寫程序:
                    (1)用STOS指令將0AAH存入100個存儲器字節(jié);
                    (2)利用LODS指令測試這些存儲器單元的內(nèi)容是否是0AAH,如果不是則顯示"bad memory"。

                DTSEG  SEGMENT
                DATAM  DB 100 DUP(?)
                MESG   DB bad memory, $
                DTSEG  ENDS
                ; - - - - - - - - - - - - - - - - - -
                CDSEG  SEGMENT
                ASSUME CS:CDSEG,DS:DTSEG,ES:DTSEG
            START: MOV   AX,DTSEG   ; initialize
                MOV   DS,AX    ; DS register
                MOV   ES,AX    ; and ES register
                CLD         ; clear DF for increment
                MOV   CX,50    ; load the counter(50 words)
                MOV   DI,OFFSET DATAM ; load the pointer for destination
                MOV   AX,0AAAAH   ; load the pattern
                REP   STOSW    ; repeat until CX=0
                ; bring in the pattern and test it one by one
                MOV   SI,OFFSET DATAM  ; load the pointer for source
                MOV   CX,100       ; load the counter(100 bytes)
            AGAIN: LODSB           ; load into AL from DS:SI
                XOR   AL,0AAH      ; is pattern the same?
                JNZ   OVER       ; if not the same, then exit
                LOOP  AGAIN       ; continue until CX=0
                JMP   EXIT       ; exit program
            OVER: MOV   AH,09       ; display
                MOV   DX,OFFSET MESG   ; the message
                INT   21H        ; routine
            EXIT: MOV   AX,4C00H      ; return to DOS
                INT   21H
                CDSEG  ENDS
                END   START

            把0AAH存入100個字節(jié)是通過執(zhí)行50次的字操作來完成的。在測試部分,LODSB指令把存儲器字節(jié)的內(nèi)容取到AL,并和數(shù)據(jù)0AAH異或,如果這兩個數(shù)相同,ZF=1,則繼續(xù)進(jìn)行下一個數(shù)的測試。如果兩數(shù)不同,則ZF=0,轉(zhuǎn)去執(zhí)行顯示字符串的BIOS功能調(diào)用。顯示字符串用了三條指令,首先在AH中裝入的顯示字符串的功能號09,然后在DX中裝入字符串的地址,再用INT 21H調(diào)用BIOS例程,完成顯示指定字符串的功能。

          例假設(shè)有人將電子字典中的"LABEL"誤拼為"LABLE",編寫程序比較這兩個詞,并根據(jù)比較結(jié)果顯示
                  (1)如果相同,則顯示"The spelling is correct";
                  (2)如果不同,則顯示"Wrong splling"。

                 DATASEG SEGMENT
                  DAT_DICT DB LABEL
                  DAT_TYPE DB LABLE
                  MESS1 DB The spelling is correct ,$
                  MESS2 DB Wrong spelling ,$
                 DATASEG ENDS
                 ; - - - - - - - - - - - - - - - - - - - - -
                 CODESEG SEGMENT
                 ASSUME CS:CODESEG,DS:DATASEG,ES:DATASEG
             START: MOV  AX,DATASEG
                 MOV  DS,AX   ; initialize the data segment
                 MOV  ES,AX   ; initialize the extra segment
                 CLD       ; DF=0 for autoincrement
                 MOV  SI,OFFSET DAT_DICT ; SI is source pointer
                 MOV  DI,OFFSET DAT_TYPE ; DI is destination pointer
                 MOV  CX,05   ; load the counter
                 REPE CMPSB   ; repeat as long as equal or until CX=0
                 JE  OVER   ; if ZF=1 then display mess1
                 MOV  DX,OFFSET MESS2 ; if ZF=0 then display mess2
                 JMP  DISP
              OVER: MOV  DX,OFFSET MESS1
              DISP: MOV  AH,09   ; display message
                 INT  21H
                 MOV  AX,4C00H ; return to DOS
                 INT  21H
             CODSEG ENDS
                 END START

             用CMPSB指令可將兩個串中的字符逐一比較,在比較SI和DI指向的第一對字符時,根據(jù)比較結(jié)果設(shè)置ZF并使(SI)+1,(DI)+1以及(CX)-1。因為第一對字符是相同的(L),所以ZF=1,于是由REPE控制再重復(fù)比較下一對字符。直到比較第四對字符E和L時,由于它們不相同,ZF設(shè)置為0,所以串比較結(jié)束。打印的信息應(yīng)是:Wrong spelling 。

          例編寫程序,將姓名中的HU DAMING(胡大明)修改為HU DANING(胡大寧),并顯示出正確的姓名。

                DATA SEGMENT
                NAME DB HU DAMING, $
                DATA ENDS
                ; - - - - - - - - - - - -
                CODE  SEGMENT
                ASSUME CS:CODE,DS:DATA,ES:DATA
             START: MOV   AX,DATA
                MOV  DS,AX    ; initialize the data segment
                MOV  ES,AX    ; initialize the extra segment
                CLD         ; DF=0 for autoincrement
                MOV   AL,M
                MOV   DI,OFFSET NAME ; DI is destination pointer
                MOV  CX,09    ; load the counter
                REPNE SCASB    ; repeat as long as equal or until CX=0
                JNE  DISP    ; if ZF=0 then display name
                DEC  DI     ; decrement to point at M
                MOV  BYTE PTR [DI],N ; replace M with N
             DISP: MOV  AH,09    ; display the corrected name
                MOV  DX,OFFSET NAME
                INT  21H
                MOV  AX,4C00H   ; return to DOS
                INT  21H
             CODE  ENDS
                END  START

            本例中,AL寄存器中的字符M與NAME中的每個字符進(jìn)行比較,如果串中字符與M不同,則DI增量,CX減量,繼續(xù)進(jìn)行下一個字符的掃描比較,一直到發(fā)現(xiàn)M或CX=0為止。在本例中,因為發(fā)現(xiàn)了M,比較的結(jié)果使ZF=1,同時DI已指向了下一個字符I,所以DI退回一個字符位置(DEC DI),并用N取代M。


          上一頁 1 2 下一頁

          評論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();