您的位置:首页 > 编程语言

80x86汇编语言编程:用光标键控制字符串的移动

2016-01-25 12:12 302 查看
;程序运行后,提示输入字符串(字符数大于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

虽然给出了图片链接,恐怕,大家也看不到,将会显示“营造绿色网络环境...”。

那么,想要看图,只能看前面给出的题目链接,在百度知道的网页中,可看到我上传的插图。

看来,管理百度知道的工程师们,更敬业一些。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: