web-dev-qa-db-ja.com

文字列入力の取得とDOS割り込みによる入力の表示MASM

MASMでは、キーボードからのユーザー文字列入力を保持するためのバッファー変数を作成しました。文字列入力をそのバッファ変数に保持する方法に固執しています。 irvineのようにリンクされたライブラリがないので、DOS割り込みでこれを実行したいと思います。これまでのところ、私はの線に沿って何かを持っています

            .model small

            .stack 100h

            .data
buff        db  25 dup(0), 10, 13
lbuff       EQU ($ - buff)              ; bytes in a string

            .code
main:
            mov ax, @data
            mov ds, ax              

            mov ah, 0Ah         ; doesn't work
            mov buff, ah        ; doesn't seem right
            int 21h                 


            mov     ax, 4000h       ; display to screen
            mov     bx, 1           
            mov     cx, lbuff           
            mov     dx, OFFSET buff     
            int     21h 

            mov ah, 4ch
            int 21h

            end main

バッファリングされた文字の入力の配列を読み取るために0Ahを使用するのは正しいと思います。

4
Jumpman

コードにいくつか変更を加えました。まず、「buff」変数には3レベルの形式(許可される最大文字数、入力された文字数の別のバイト、およびバッファー自体)が必要です。これは、サービス0AHが必要とするものだからです。サービス0AHを使用するために、「オフセットバフ」を追加しました(Wolfgangが言ったように)。ここにあります:

            .model small

            .stack 100h

            .data

buff        db  26        ;MAX NUMBER OF CHARACTERS ALLOWED (25).
            db  ?         ;NUMBER OF CHARACTERS ENTERED BY USER.
            db  26 dup(0) ;CHARACTERS ENTERED BY USER.

            .code
main:
            mov ax, @data
            mov ds, ax              

;CAPTURE STRING FROM KEYBOARD.                                    
            mov ah, 0Ah ;SERVICE TO CAPTURE STRING FROM KEYBOARD.
            mov dx, offset buff
            int 21h                 

;CHANGE CHR(13) BY '$'.
            mov si, offset buff + 1 ;NUMBER OF CHARACTERS ENTERED.
            mov cl, [ si ] ;MOVE LENGTH TO CL.
            mov ch, 0      ;CLEAR CH TO USE CX. 
            inc cx ;TO REACH CHR(13).
            add si, cx ;NOW SI POINTS TO CHR(13).
            mov al, '$'
            mov [ si ], al ;REPLACE CHR(13) BY '$'.            

;DISPLAY STRING.                   
            mov ah, 9 ;SERVICE TO DISPLAY STRING.
            mov dx, offset buff + 2 ;MUST END WITH '$'.
            int 21h

            mov ah, 4ch
            int 21h

            end main

0AHがキーボードから文字列をキャプチャする場合、ENTER(文字13)で終わります。そのため、25文字をキャプチャする場合は、26を指定する必要があります。

ユーザーが入力した文字数(長さ)を知るには、2番目のバイト(オフセットバフ+1)にアクセスします。 ENTERは含まれていないため、ユーザーが8文字を入力してENTERを押すと、この2番目のバイトには9ではなく8という数字が含まれます。

入力された文字はオフセットバフ+2で始まり、文字13が表示されたときに終了します。これを使用して長さをbuff + 2 + 1に追加し、chr(13)を「$」に​​置き換えます。これで文字列を表示できます。

これは私のコードです、多分あなたを助けることができます。

;Input String Copy output

dataarea segment
    BUFFER db 81
           db ?
    STRING DB 81 DUP(?)
    STR1 DB 10,13,'$'   
dataarea ends

extra segment
    MESS1 DB 'After Copy',10,13,'$'
    MESS2 DB 81 DUP(?)
extra ends

code segment
main proc far
    assume cs:code,ds:dataarea,es:extra
start:
    Push ds
    sub ax,ax
    Push ax

    mov ax,dataarea   
    mov ds,ax

    mov ax,extra      
    mov es,ax

    lea dx,BUFFER     
    mov ah,0ah
    int 21h

    lea si,STRING
    lea di,MESS2
    mov ch,0
    mov cl,BUFFER+1
    cld
    rep movsb
    mov al,'$'
    mov es:[di],al

    lea dx,STR1            ;to next line
    mov ah,09h
    int 21h

    Push es
    pop ds

    lea dx,MESS1           ;output:after copy
    mov ah,09h
    int 21h

    lea dx,MESS2
    mov ah,09h
    int 21h

    ret
main endp
code ends
    end start

そして結果は次のとおりです。

c:\demo.exe
Hello World!
After Copy
Hello World!
1
黄壮壮

あなたはこのコードに従うことができます:

; Problem : input array from user

.MODEL SMALL
.STACK
.DATA
   ARR DB 10 DUB (?)     

.CODE
 MAIN PROC
    MOV AX, @DATA
    MOV DS, AX

    XOR BX, BX
    MOV CX, 5

    FOR: 
      MOV AH, 1
      INT 21H
      MOV ARR[BX], AL
      INC BX
    LOOP FOR

    XOR BX, BX
    MOV CX, 5

    PRINT:  
     MOV AX, ARR[BX] ;point to the  current index 

     MOV AH, 2       ;output
     MOV DL, AX  
     INT 21H     

     INC BX           ;move pointer to the next element 
    LOOP PRINT       ;loop until done

 MAIN ENDP
0
rashedcs

;これを試してみてください。ユーザーからの10文字の文字列入力を受け取り、「こんにちは* 10文字の文字列入力」の後に表示します。

.MODEL TINY
.CODE
.286
ORG 100h

    START:
     MOV DX, OFFSET BUFFER
     MOV AH, 0ah
     INT 21h
     JMP PRINT
     BUFFER DB 10,?, 10 dup(' ')

     PRINT:
     MOV AH, 02
     MOV DL, 0ah
     INT 21h
     MOV AH, 9
     MOV DX, OFFSET M1
     INT 21h
     XOR BX, BX
     MOV BL, BUFFER[1]
     MOV BUFFER [BX+2], '$'
     MOV DX, OFFSET BUFFER +2
     MOV AH, 9
     INT 21h

    M1: db 'Hello $'


 END START
 END      
0
AbbieRojo