80x86彙編語言編程:用光標鍵控制字符串的移動


;程序運行後,提示輸入字符串(字符數大於5個)。

;按右移鍵則字符以一定速率向右移動,移到右邊則字符再從左邊出來。

;按左移鍵,則字符向左移動,再從右邊出來.行號不變。


;題目鏈接:

;http://zhidao.baidu.com/question/1495259981644380779.html


;做而論道編寫的程序如下。


;===================================

ASSUME   CS:CC, DS:QW

;-----------------------------------

QW  SEGMENT

    STR   DB  81  DUP (20H)

    IN_B  DB  20, ?, 20 DUP (?)

    FH    DB  0

    TIP1  DB  'Please input a string : $'

    TIP2  DB  13, 10, 'You can press keys : '

          DB  27, 26, ' change direction,'

          DB  24, 25, ' change speed,  ESC  exit. $'

    DL_X  DW  800      ;控制移動速度

    MAX   EQU   3600       ;越大移動越慢

    MIN   EQU   200        ;越小移動越快

QW  ENDS

;-----------------------------------

CC  SEGMENT


S_T:

    MOV   AX, QW

    MOV   DS, AX

    MOV   AX, 0B800H

    MOV   ES, AX

;-------------------------

    LEA   DX, TIP1

    MOV   AH, 9

    INT   21H


    LEA   DX, IN_B

    MOV   AH, 10

    INT   21H

    MOV   BL, IN_B + 1

    CMP   BL, 5

    JA    GO_ON     ;多於5個,就繼續

    JMP   EXIT      ;不足,則退出


GO_ON:

    MOV   BH, 0


    LEA   DX, TIP2

    MOV   AH, 9

    INT   21H


    MOV   CX, BX

    MOV   SI, 0

LP1:

    MOV   AL, IN_B[SI + 2]

    MOV   STR[SI], AL

    INC   SI

    LOOP  LP1


M_LOOP:

    CALL  DISP_STR

    CALL  DELAY

    MOV   AH, 1      ;

    INT   16H        ;僅讀狀態

    JZ    YIDS       ;爲零就是沒有按

    MOV   AH, 0      ;按下則再讀

    INT   16H        ;AH=掃描碼,AL=ASCII碼

    CMP   AL, 27

    JE    EXIT


    CMP   AH, 48H    ;

    JE    UP

    CMP   AH, 50H

    JE    DN

    CMP   AH, 4BH

    JE    ZL

    CMP   AH, 4DH

    JE    ZR

    JMP   YIDS       ;轉去移動

;----------------------------------

UP:

    CMP   DL_X, MIN

    JB    YIDS

    SUB   DL_X, 100

    JMP   YIDS

DN:

    CMP   DL_X, MAX

    JA    YIDS

    ADD   DL_X, 100

    JMP   YIDS


ZR: MOV   FH, 0      ;改變方向

    JMP   YIDS

ZL: MOV   FH, 1


YIDS:                ;移動

    TEST  FH, 1      ;判別方向

    JE    RRR

    CALL  L_SHIFT

    JMP   M_LOOP

RRR:

    CALL  R_SHIFT

    JMP   M_LOOP

;---------------------------

EXIT:

    MOV   AH, 4CH

    INT   21H

;-----------------------------------

DELAY:

    PUSH  DX

    PUSH  CX

    MOV   DX, DL_X

    MOV   CX, 0

DL_LP1:

    NOP

    NOP

    LOOP  DL_LP1

    DEC   DX

    JNZ   DL_LP1

    POP   CX

    POP   DX

    RET

;-----------------------------------

DISP_STR:

    MOV   SI, 0

    MOV   DI, 0

    MOV   AH, 4EH

    MOV   CX, 80

LP2:

    MOV   AL, STR[SI]

    MOV   ES:[DI + 12 * 160], AX

    INC   SI

    ADD   DI, 2

    LOOP  LP2

    RET

;-----------------------------------

R_SHIFT:

    MOV   SI, 79

    MOV   CX, 80

RS_LOOP:

    MOV   AL, STR[SI]

    MOV   STR[SI + 1], AL

    DEC   SI

    LOOP  RS_LOOP

    MOV   AL, STR[80]

    MOV   STR[0], AL

    RET

;-----------------------------------

L_SHIFT:

    MOV   SI, 0

    MOV   AL, STR[0]

    MOV   STR[80], AL

    MOV   CX, 80

LS_LOOP:

    MOV   AL, STR[SI + 1]

    MOV   STR[SI], AL

    INC   SI

    LOOP  LS_LOOP

    RET

;-----------------------------------

CC  ENDS

    END   S_T

;===================================


以上程序經過編譯、連接、執行後,顯示的截圖如下:


近來,在百度空間插圖,都不正常。

在主頁的頁面,可以看到這篇文章已經插圖了,但是,打開本頁面,卻不顯示插圖。

看來,百度空間項目組的工資,確實是應該漲一點了。


圖片鏈接:

http://xiangce.baidu.com/picture/detail/9022db56d4d174875dbf619dbd33ec2b792b80e2


雖然給出了圖片鏈接,恐怕,大家也看不到,將會顯示“營造綠色網絡環境...”。


那麼,想要看圖,只能看前面給出的題目鏈接,在百度知道的網頁中,可看到我上傳的插圖。


看來,管理百度知道的工程師們,更敬業一些。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章