2012-11-03 16 views
9

Thông tin của tôi đến từ here. Bài tập yêu cầu một chương trình đọc không quá 20 ký tự, chuyển đổi các ký tự đó thành chữ hoa, và sau đó in đầu vào làm thủ đô.Tôi không hiểu cách sử dụng Gián đoạn 21, AH = 0ah

Tôi không biết cách truy cập dữ liệu nhập từ int21/AH = 0ah. Tôi thực sự không thể hỏi một câu hỏi chính xác hơn trừ khi tôi hiểu những gì được liên kết ở trên. Ai đó có thể giải thích? Ngoài ra, tôi đang sử dụng TASM nếu điều đó tạo ra bất kỳ sự khác biệt nào. Ngoài ra, tôi đang thử nghiệm này trên freedos.

UPDATE1:

Alright, nhờ sự giúp đỡ của bạn, tôi tin rằng tôi hiểu làm thế nào ngắt cần phải được thiết lập và hoạt động.

Setup: tôi phải chỉ định một ds: dx nơi tôi muốn đệm này để tồn tại

tôi phải thiết lập ds: dx đến 20 (trong đó đặt số tối đa của nhân vật bộ đệm có thể giữ)

tôi phải thiết lập ds: dx + 1-0 (mà tôi nghĩ rằng bằng cách nào đó thiết lập một số phút của các nhân vật để đọc trong)

Thực ra gọi int21/AH = 0AH, mà sẽ đi đến ds: dx và giải thích các byte được đặt trước. Nó sẽ ngăn chặn chương trình trong khi chờ đầu vào

int21/AH = 0AH sẽ điền từ ds: dx + 2 + n với sự đóng góp của tôi (trong đó n là số ký tự đầu vào bao gồm cả '\ r')

Câu hỏi của tôi bây giờ là làm cách nào để thực hiện điều này. Tôi vừa xem lại Tài liệu tham khảo ngôn ngữ hội x86 một lần nữa, nhưng chưa tìm thấy bất cứ điều gì hữu ích.

Mã Tôi đã có cho đến nay

  assume   cs:code,ds:code 
code  segment 
start: 

      mov ax,code ;moves code segment into reg AX 
      mov ds,ax ;makes ds point to code segment 

      mov ah,0ah 
      int 21h 
      mov ax,1234h ;breakpoint 

      mov ah,9 
      mov dx,offset message 
      int 21h 

endNow: 
      ;;;;;;;;;;ends program;;;;;;;;;; 
      mov ah,0 ;terminate program 
      int 21h ;program ends 

message db 'Hello world!!!',13,10,'$' 
code  ends 
      end start 

Trả lời

6

Đó DOS chức năng lấy một bộ đệm với người dùng nhập vào. Xem trang này table. Có vẻ như chương trình đang sử dụng cuộc gọi đó để tạm dừng thực hiện chờ người dùng tiếp tục chương trình.

Chỉnh sửa: Tôi chỉ đọc lại câu hỏi. Tôi nghĩ rằng bạn chỉ hỏi những gì các cuộc gọi chức năng đã làm trong nguồn nhất định của bạn. Nếu bạn muốn đọc đầu vào không quá 20 ký tự, trước hết bạn cần bộ nhớ để lưu trữ. Thêm một cái gì đó như thế này:

bufferSize db 21 ; 20 char + RETURN 
inputLength db 0 ; number of read characters 
buffer  db 21 DUP(0) ; actual buffer 

Sau đó điền vào bộ đệm:

mov ax, cs 
mov ds, ax ; ensure cs == ds 
mov dx, offset bufferSize ; load our pointer to the beginning of the structure 
mov ah, 0Ah ; GetLine function 
int 21h 

Làm thế nào để chuyển đổi sang chữ hoa còn lại để người đọc.

+0

Sau đó, nó hoạt động như int21/AH = 1h đọc trong một ký tự đơn. Tôi biết rằng ngắt đó đặt ký tự vào thanh ghi AL. Làm thế nào tôi sẽ tìm ra nơi bộ đệm của các nhân vật sẽ được? –

+0

Ngoài ra, tôi vừa mới nhận ra. Bảng bù trừ có nghĩa là dữ liệu ký tự thực tế bắt đầu ở hai bit hoặc byte (có thể là byte), nơi dữ liệu trả về tồn tại trong bộ nhớ. Suy nghĩ? –

+0

Có, đầu vào thực tế bắt đầu tại DS: DX + 2. Tuy nhiên, tệp này bỏ qua đầu vào đó và chỉ sử dụng chức năng đó để tạm dừng thực thi. –

1

Mô tả đó cho biết bạn đặt địa chỉ của bộ đệm trong ds:dx trước khi gọi ngắt. Sau đó, ngắt sẽ điền vào bộ đệm đó với các ký tự mà nó đọc.

Trước khi gọi ngắt, byte đầu tiên của bộ đệm là số lượng ký tự mà bộ đệm có thể giữ hoặc 20 trong trường hợp của bạn. Tôi không hiểu các mô tả của byte thứ hai của bộ đệm (trên đầu vào để ngắt), vì vậy tôi sẽ đặt nó bằng không. Khi trả về, byte đó sẽ cho bạn biết có bao nhiêu ký tự đầu vào được đọc và được đặt vào bộ đệm.

+0

Vì vậy, làm thế nào tôi hiểu lời giải thích của bạn, địa chỉ nơi tôi có thể tìm thấy bộ đệm được chia trên ds đăng ký và dx. –

+0

câu hỏi tranh luận, hãy cho tôi một phút để suy nghĩ về những điều trên. –

+0

(sửa lỗi đánh máy) Sắp xếp. 'ds' là thanh ghi phân đoạn; 'dx' là giá trị offset. Và bạn không "tìm" bộ đệm; bạn _provide_ bộ đệm bằng cách đặt 'ds' và' dx' để trỏ đến nó trước khi gọi ngắt. (Bạn cũng cần phải thiết lập hai byte đầu tiên của bộ đệm trước khi gọi ngắt. Bộ đệm - và hai byte đầu tiên của nó - là đầu vào cho ngắt.) - Nemo 11 phút trước – Nemo

0
.model small 
.stack 100h 
.data 
    N db ? 
    msg db 10,13,09,"Enter number of arrays---->$" 
.code 
.startup 
    mov ax,@data 
    mov ds,ax 
    call read_N;read N from console 




    mov ah,4ch 
    int 21h 

Read_N proc 
    ;get number of arrays from user 

    push ax 
    push dx 

readAgain: 

    mov ax,03h ;Clear screen 
    int 10h 

    mov dx,offset msg 
    mov ah,09h 
    int 21h 

    call ReadNumber 

    ;Inuput number must be in 2<=N<=10 bounery 
    cmp al,2 
    js readAgain ;input out of boundary read again 
    cmp al,10 
    jg readAgain 
    mov N,al 
    pop dx 
    pop ax 
    ret 
Read_N endp 

ReadNumber proc 
    ;read decimal number 0-99 using 
    ;character by character in askii and conver in to decimal 
    ;return result in al 
    xor ax,ax 
    xor bx,bx 
    xor dx,dx 

    mov ah,01h 
    int 21h 

    sub al,'0' ;conver in to decimal 
    mov bl,al 

    mov ah,01h 
    int 21h 
    cmp al,0dh ;Exit if enter pressed 
    jnz cont 
    mov al,bl 
    jmp exit 
    cont: 
    sub al,'0' ;conver in to decimal 
    mov dl,al 

    xor al,al 
    xor bh,bh 
    mov cx,bx 
    addnum:  
    add al,10 
loop addnum 

    add al,dl 
    exit: 
    ret 
ReadNumber endp 

end   
Các vấn đề liên quan