2015-04-08 57 views
3

在MASM中,我創建了一個緩衝區變量來保存來自鍵盤的用戶字符串輸入。我被困在如何將字符串輸入保存到該緩衝區變量中。我沒有像irvine那樣鏈接任何庫,並且想用DOS中斷來做這件事。到目前爲止,我有我一起承擔使用0AH是正確的,因爲它是用於讀取緩衝的字符輸入數組的使用DOS中斷獲取字符串輸入和顯示輸入MASM

  .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 

行的東西。

+0

'INT 21H/0Ah'需要的緩衝區的地址'dx'。緩衝區中的第一個字節需要是最大輸入。通過在裏面填入'ah',你說你想要十個字符(可能需要更多)。中斷返回後,第二個字節是實際輸入的字符數。輸入文本從緩衝區+2開始。 –

+0

@FrankKotler好吧,我部分地通過執行mov dx,offset 25 \t mov ah,0Ah \t int 21h(對不起,我不確定如何在註釋中對此進行格式化)。所以輸入的字符從dx + 2開始?我將如何將它移入我的buff變量中? – Jumpman

+0

輸入函數在dx寄存器中需要緩衝區「mov dx,OFFSET buff」的開始和緩衝區第一個字節中的最大輸入,例如10個字符的「mov [buff],ah」。輸出函數需要「mov dx,OFFSET buff + 2」和輸入的實際字符數「mov cl,[buff + 1]」。 –

回答

7

我對代碼做了一些修改。首先,「buff」變量需要三級格式(允許的最大字符數,輸入字符數的另一個字節以及緩衝區本身),因爲這是服務0AH所要求的。爲了使用服務0AH,我添加了「offset buff」(正如沃爾夫岡所說)。那就是:

  .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捕獲從鍵盤字符串,它與回車(字符13),這就是爲什麼,如果你想捕捉到25個字符,你必須指定26

要知道結束用戶輸入了多少個字符(長度),訪問第二個字節(offset buff + 1)。 ENTER不包括在內,因此,如果用戶鍵入8個字符並按ENTER鍵,則第二個字節將包含數字8,而不是9.

輸入的字符從偏移量buff + 2開始,當字符13出現時它們結束。我們用這個來增加buff + 2 + 1的長度,用'$'代替chr(13)。現在我們可以顯示字符串了。

+0

是的:這3行代碼都在buff變量中。是的:如果你想用字符串修改角色,你必須讓SI指向buff + 2。 –

+0

使用09h函數來使用40h或4000h(我不確定爲什麼4000h,它是我的參考資料的一部分),而不是使用09h函數更容易,因此它不必在字符串的結尾?我可以告訴它的缺點是,即使用戶沒有輸入完整的25個字符,它也會顯示全部25個字符。 – Jumpman

+0

如果你知道長度,你可以使用ah = 13h int 10h(像這個答案http://stackoverflow.com/questions/29460318/how-to-print-colored-string-in-assembly-language/29478158# 29478158),但是,如果您不想考慮長度,可以使用$。我從來沒有嘗試過40小時或4000小時。 –

1

這是我的代碼,也許可以幫助你。

;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! 
0

您可以參照下面的代碼:

; 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 
相關問題