zoukankan      html  css  js  c++  java
  • 【汇编】从键盘输入字符串并输出该字符串(汇编程序)

    原文地址http://blog.sina.com.cn/s/blog_4b7bd3380100a76z.html
    

      


    1
    DATAS SEGMENT 2 STR DB"please input a string:$" 3 BUF DB 20 4 DB ? 5 DB 20 DUP (?) 6 CRLF DB 0AH,0DH,"$";此处输入数据段代码 7 DATAS ENDS 8 STACKS SEGMENT STACK 9 DB 200 DUP(?) ;此处输入堆栈段代码 10 STACKS ENDS 11 12 CODES SEGMENT 13 ASSUME CS:CODES,DS:DATAS,SS:STACKS 14 START: MOV AX,DATAS 15 MOV DS,AX 16 LEA DX,STR 17 MOV AH,9 18 INT 21H 19 MOV AH,10 20 LEA DX,BUF 21 INT 21H 22 LEA DX,CRLF 23 MOV AH,9 24 INT 21H 25 MOV CL,BUF+1 26 LEA SI,BUF+2 27 NEXT: MOV DL,[SI] 28 MOV AH,2 29 INT 21H 30 INC SI 31 DEC CL 32 JNZ NEXT;此处输入代码段代码 33 MOV AH,4CH 34 INT 21H 35 CODES ENDS 36 END START

        以上是从键盘输入字符串并输出该字符串的简单汇编程序

        以下是整理的对上面程序的部分解释:

        BUF:键盘缓冲区BUF。

        DB:定义变量的类型为字节类型。

        DB 20:表示缓冲区能容纳20个字符。

        DB 200 DUP(?)中的问号:不对分配的存储单元初始化。

        DS:存放当前数据段的段地址。

        CS:存放当前代码段的段地址。

        SS:存放当前堆栈段的段地址。

        MOV:传送指令。

        AX:存放接收到的数据或发送数据。

        DX:使用间接寻址时存放端口地址。

        LEA:取偏移地址。

        CL:在移位指令和循环移动指令中,存放移位次数或者循环移位次数。

        SI:在存储器寻址时,作为变址寄存器。在串操作中,作为源串指针。

        DEC:decrement。

        INC:increment。

        INT:interruput。

     

     1 DATAS SEGMENT
     2 STR   DB"please input a string:$"  
     3 BUF   DB 20        ;这里的20为指定存放字符的个数(理论上的)
     4       DB ?        ;这的?可变,实际存放字符的个数(系统自动计算)
     5       DB 20 DUP (?)    ;这里的20是你在数据段开辟的空间           
     6 CRLF  DB 0AH,0DH,"$";回车换行;此处输入数据段代码
     7 DATAS ENDS
     8 STACKS SEGMENT STACK    
     9        DB      200 DUP(?) ;此处输入堆栈段代码
    10 STACKS ENDS
    11 
    12 CODES  SEGMENT
    13        ASSUME CS:CODES,DS:DATAS,SS:STACKS
    14 START: MOV AX,DATAS
    15        MOV DS,AX
    16        LEA DX,STR    ;9号中断前提,给参数DX赋值,指定输出字符串所在的有效地址
    17        MOV AH,9
    18        INT 21H
    19        MOV AH,10    ;10号中断,接收输入字符串,此时DX为存放字符串的有效地址
    20        LEA DX,BUF
    21        INT 21H
    22        LEA DX,CRLF
    23        MOV AH,9
    24        INT 21H
    25        MOV CL,BUF+1    ;获取字符串中字符的个数
    26        LEA SI,BUF+2    ;间接寻址
    27 NEXT:  MOV DL,[SI]
    28        MOV AH,2        ;2号中断输出单个字符
    29        INT 21H
    30        INC SI        ;输出一个地址往后加1
    31        DEC CL        ;顺便减少输出的次数
    32        JNZ NEXT        ;此处输入代码段代码
    33        MOV AH,4CH
    34        INT 21H
    35 CODES  ENDS
    36     END START
    37 
    38  

        2号调用是逐个显示字符,9号调用是一次完成字符串的显示,但结尾得加上 '$'。最上面程序中用的2号调用,使用循环输出字符串。要将2号调用改为9号调用,必须改程序中的循环结构为顺序结构。很明显,程序中的

    NEXT:

    INC SI

    DEC CL

    JNZ NEXT

    都要去掉。

    所以问题简化为改

    MOV DL,[SI]
    MOV AH,2

    部分为9号调用,以及在9号调用后加上'$'。

    续last:

    以下是在编程爱好者论坛上请教别人加上自己的整理得出的答案,并非最简。

     1 DATAS SEGMENT
     2 STR   DB 'please input a string:$' 
     3 BUF   DB 20
     4       DB ?
     5       DB 20 DUP (?)
     6 CRLF  DB 0AH,0DH,"$"
     7 ;此处输入数据段代码 
     8 DATAS ENDS
     9 
    10 STACKS SEGMENT STACK
    11        DB      200 DUP(?) ;此处输入堆栈段代码
    12 STACKS ENDS
    13 
    14 CODES  SEGMENT
    15        ASSUME CS:CODES,DS:DATAS,SS:STACKS
    16 START: MOV AX,DATAS
    17        MOV DS,AX
    18 
    19        LEA DX,STR
    20        MOV AH,9
    21        INT 21H
    22 
    23        MOV AH,10
    24        LEA DX,BUF
    25        INT 21H
    26 
    27        LEA DX,CRLF
    28        MOV AH,9
    29        INT 21H
    30       
    31        ;开始改的部分
    32        mov bl,BUF+1           ;输出这里开始
    33        mov bh,0               ;
    34        lea si,BUF+2           ;首地址
    35        mov byte ptr[si+bx],'$';结尾得加上 '$'
    36        mov DX,si             ;
    37        MOV AH,9               ;
    38        INT 21H                ;结束
    39 
    40        MOV AH,4CH
    41        INT 21H
    42 CODES  ENDS
    43 END START

    程序中mov byte ptr[si+bx],'$'可以改为mov [si+bx],'$'  ,mov bh,0也可以去掉,这样就得出最简答案了。

    终结:

     1 DATAS SEGMENT
     2 STR   DB 'Please input a string:$'
     3 BUF   DB 20
     4       DB ?
     5       DB 20 DUP(24H)
     6 CRLF  DB 0AH,0DH,'$'
     7   DATAS ENDS
     8 
     9 STACKS SEGMENT
    10        DB 200 DUP(?)
    11 STACKS ENDS
    12 
    13 CODES SEGMENT
    14     ASSUME CS:CODES,DS:DATAS,SS:STACKS
    15 START:
    16     MOV AX,DATAS
    17     MOV DS,AX
    18    
    19     LEA DX,STR
    20     MOV AH,9
    21     INT 21H
    22    
    23     MOV AH,10
    24     LEA DX,BUF
    25     INT 21H
    26    
    27     LEA DX,CRLF
    28     MOV AH,9
    29     INT 21H
    30    
    31     LEA DX,BUF+2
    32     MOV AH,9
    33     INT 21H
    34    
    35    
    36     MOV AH,4CH
    37     INT 21H
    38 CODES ENDS
    39     END START

    真正理解DOS10号以及9号功能,又得到一个答案:

     1 DATAS SEGMENT
     2 STR   DB 'Please input a string:$'
     3 BUF   DB 20
     4       DB ?
     5       DB 20 DUP(?)
     6 CRLF  DB 0AH,0DH,'$'
     7   DATAS ENDS
     8 
     9 STACKS SEGMENT
    10        DB 200 DUP(?)
    11 STACKS ENDS
    12 
    13 CODES SEGMENT
    14     ASSUME CS:CODES,DS:DATAS,SS:STACKS
    15 START:
    16     MOV AX,DATAS
    17     MOV DS,AX
    18    
    19     LEA DX,STR
    20     MOV AH,9
    21     INT 21H
    22    
    23     MOV AH,10
    24     LEA DX,BUF
    25     INT 21H
    26    
    27     LEA DX,CRLF
    28     MOV AH,9
    29     INT 21H
    30    
    31     MOV AL,BUF+1
    32     ADD AL,2
    33     MOV AH,0
    34     MOV SI,AX
    35     MOV BUF[SI],24H
    36     LEA DX,BUF+2
    37     MOV AH,9
    38     INT 21H
    39    
    40    
    41     MOV AH,4CH
    42     INT 21H
    43 CODES ENDS
    44     END START
  • 相关阅读:
    前端学习(21)~css学习:如何让一个元素水平垂直居中?
    前端学习(20)~css布局(十三)
    前端学习(19)~css3属性(十二):Flex布局图片详解
    前端学习(18)~css3属性学习(十一):动画详解
    前端学习(16)~css3属性学习(十)
    蓝桥---大臣的旅费(求树的直径)
    蓝桥---乘积最大(区间dp、数据水的话long long,暴力就能过)
    蓝桥---错误票据(注意输入)
    蓝桥---带分数(全排列)
    蓝桥---传球游戏(dp)
  • 原文地址:https://www.cnblogs.com/tenderwx/p/5349964.html
Copyright © 2011-2022 走看看