【匯編】從鍵盤輸入字符串並輸出該字符串(匯編程序)


原文地址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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM