2012-11-03 2 views
9

내 정보는 here에서옵니다. 할당은 20 문자를 초과하지 않고 그 문자를 대문자로 변환 한 다음 대문자로 입력을 인쇄하는 프로그램을 요구합니다.인터럽트 21, AH = 0ah 사용 방법을 모르겠 음

int21/AH = 0ah에서 입력에 액세스하는 방법을 알 수 없습니다. 위에 링크 된 내용을 이해하지 못한다면 더 정확한 질문을 할 수 없습니다. 누군가 설명 할 수 있습니까? 또한 차이가 있다면 TASM을 사용하고 있습니다. 또한, 나는 freedos에서 이것을 테스트하고있다.

갱신 1 : 당신의 도움에 좋아

, 덕분에, 나는 인터럽트가 설정되어야하며 작동하는 방식을 이해 생각한다.

설정 : 나는 DS를 지정해야 :이 버퍼 내가 DS를 설정해야

존재 할 DX : (버퍼에 저장할 수있는 문자의 최대 수를 설정) 20 DX

내가 DS를 설정해야합니다 : DX + 1

는 사실 int21 전화/AH는 = DS로 이동합니다 0AH, (어떻게 든에서 읽을 문자의 최소 수를 설정 생각) 0 : DX를하고 사전 설정된 바이트를 해석하십시오. 이 입력을 대기하는 동안은 프로그램을 정지한다

int21/AH = DS에서 채울 0AH : DX

(n은 문자 입력의 수가 '\ r에 "포함하다) 내 입력과 + 2 + N

내 질문은 지금, 어떻게해야합니까? 나는 x86 Assembly Language Reference를 다시 살펴 보았지만 아직 도움이되는 것을 찾을 수 없었다.

코드 지금까지

  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 

답변

6

DOS 기능은 사용자 입력 버퍼를 검색 함을 가지고있다. 이 부분은 table을 참조하십시오. 프로그램이 해당 호출을 사용하여 사용자가 프로그램을 다시 시작할 때까지 기다리는 실행을 일시 중지 한 것처럼 보입니다.

편집 : 방금 질문을 읽었습니다. 나는 여러분이 주어진 소스에서 함수 호출이 무엇을했는지 묻고 있다고 생각했다. 20 자 이하의 입력을 읽으려면 먼저 메모리를 저장해야합니다. 이런 식으로 뭔가를 추가

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

그런 다음 버퍼를 채우기 : 독자에게 남아 대문자로 변환하는 방법

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 

.

+0

그러면 단일 문자로 읽는 int21/AH = 1h와 같이 작동합니다. 나는 그 인터럽트가 AL을 레지스터에 넣는다는 것을 안다. 캐릭터 버퍼가 어디에 있는지 어떻게 알 수 있을까요? –

+0

또한 방금 깨달았습니다. 오프셋 테이블은 실제 문자 데이터가 메모리에 반환 데이터가있는 곳으로부터 2 비트 또는 바이트 (아마도 바이트) 떨어져 시작 함을 의미합니다. 생각? –

+0

예, 실제 입력은 DS : DX + 2에서 시작합니다. 그러나이 파일은 해당 입력을 무시하고 해당 함수를 사용하여 실행을 일시 중지합니다. –

1

설명에 따르면 인터럽트를 호출하기 전에 버퍼 주소를 ds:dx에 넣으라고합니다. 인터럽트는 버퍼를 읽는 문자로 채 웁니다.

인터럽트를 호출하기 전에 버퍼의 첫 번째 바이트는 버퍼에 저장할 수있는 문자 수 또는 사용자의 경우 20 개입니다. 인터럽트 입력의 버퍼의 두 번째 바이트에 대한 설명을 이해할 수 없으므로이를 0으로 설정합니다. 돌아올 때, 그 바이트는 얼마나 많은 입력 문자가 읽혀지고 버퍼에 놓 였는지를 알려줄 것입니다.

+0

그래서 내가 당신의 설명을 어떻게 이해하는지, 버퍼를 찾을 수있는 주소는 레지스터 ds와 dx에 걸쳐 나누어 져 있습니다. –

+0

부끄러운 질문, 위의 내용에 대해 잠시 생각해보십시오. –

+0

(오타 수정) 일종의. 'ds'는 세그먼트 레지스터입니다. 'dx'는 오프셋입니다. 그리고 여러분은 버퍼를 "찾지"않습니다. 인터럽트를 호출하기 전에'ds'와'dx'를 가리켜 버퍼를 제공합니다. (또한 인터럽트를 호출하기 전에 버퍼의 처음 두 바이트를 설정해야합니다. 버퍼와 처음 두 바이트는 인터럽트 입력입니다.) - Nemo 11 분 전 – 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   
관련 문제