数据键入与排序程序--80x86汇编语言

来源:互联网 发布:linux怎么写shell脚本 编辑:程序博客网 时间:2024/06/05 09:46

有人给出了“数据排序”和“键入并显示”两个程序,希望能够把它们合并到一起。

并且要求使用子程序调用的形式。

经过做而论道的整理,把它们成功的合并了,程序如下:

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

assume  cs:code, ds:data

data   segment

    msg1    db  'Before sort: $'

    crlf    db  0dh, 0ah, '$'

    msg2    db  'After sort : $'

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

    BUFSIZE DB 50          ;最多可键入50个字符.

    ACTLEN  DB ?           ;实际键入的字符数.

    CHARS   DB 50 DUP(20H) ;实际键入的字符从此开始存放.

data   ends

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

code   segment

MAIN   PROC   FAR             ;主程序.

start:

    mov  ax, data

    mov  ds, ax

    mov  dx, offset msg1

    mov  ah, 9

    int  21h

    MOV  DX, OFFSET BUFSIZE   ;键入缓冲区起始偏移地址送DX

    MOV  AH, 0AH

    INT  21H                  ;输入字符串并送入缓冲区.

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

    MOV  CL, ACTLEN           ;取得输入的字符数.

    ADD  CL, 0

    JNZ  ok                   ;长度不为零就去排序.

    JMP  EXIT_MAIN

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

ok:    

    mov  dx, offset crlf

    mov  ah, 9

    int  21h

    mov  dx, offset msg2

    mov  ah, 9

    int  21h

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

    CALL SORT     ;调用排序子程序.

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

    XOR  CX, CX

    MOV  CL, ACTLEN           ;取得输入的字符数.

    MOV  DX, OFFSET CHARS     ;输入的字符串起始地址送DX

    MOV  BX, DX               ;将字符串首地址送BX

    ADD  BX, CX               ;取到字符串尾地址.

    MOV  BYTE PTR [BX], '$'   ;在字符串尾插$

    MOV  AH, 09H              ;字符串显示功能.

    INT  21H                  ;显示键入的字符串.

EXIT_MAIN:

    mov  ah, 4ch

    int  21h                  ;返回DOS

MAIN  ENDP                    ;主程序的末尾.

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

SORT  PROC         ;排序子程序.

    XOR  CX, CX

    MOV  CL, ACTLEN           ;取得输入的字符数.

    DEC  CX

    mov  si, offset CHARS

s:  push cx

    mov  di, si

s1: mov  al, [di]

    inc  di

    cmp  al, [di]

    jb   jx

    xchg al, [di]

    mov  [di - 1], al

jx:

    loop s1

    pop  cx

    loop s

    RET           ;子程序返回主程序.

SORT  ENDP

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

code   ends

    end  start

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

程序中,小写的是原来的排序程序,大写的是键入显示程序。

程序经过编译、连接,生成可执行文件,执行的效果如下:


Before sort: sdlfmweiowe&^*^&*&(@#@~!^&*^&^(^&JGTHJbdfgbdf6%^%

After sort : !#%%&&&&&&((***6@@GHJJT^^^^^^^bbdddeefffgilmosww~


键入的字符的数目,程序限定了50个,超过50,光标就停止不走了。

注意:键入的字符,不要有"$",因为排序后,显示字符串的时候,是调用了微软的“9号系统功能调用”。

微软的“9号系统功能调用”,只能显示"$"前面的,碰到了"$",它们就留下了,不再显示。

呵呵,真是财迷!

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

原题网址:http://zhidao.baidu.com/question/254320555.html

本题目共有三人给出了答案,有两个正确的。

楼主却选择了一个错误答案做为最佳答案,真能搞笑。

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


0 0
原创粉丝点击