我不知道如何使用中断21,AH = 0AH(I don't understand how t

2019-07-03 13:27发布

我的信息是来自这里 。 的分配请求一个程序,读取在不超过20个字符,这些字符转换为大写,然后打印输入作为首都。

我不知道如何从INT21 / AH = 0AH访问输入。 我真的,除非我明白了什么是上面链接不能要求一个更精确的问题。 有人能解释一下吗? 另外,我使用TASM如果有什么差别。 另外,我上的FreeDOS测试此。

UPDATE1:

好了,感谢你的帮助,我相信我明白中断需要如何设置和行为。

设置:我必须指定一个DS:DX,我想这个缓冲区存在

我必须设置DS:DX 20(它设置字符缓冲区可容纳的最大数量)

我必须设置DS:DX + 1到0(我认为在某种程度上设定最低数量的字符读取)

实际调用INT21 / AH = 0AH,这将去DS:DX和解释预设字节。 在等待输入将暂停程序

INT21 / AH = 0AH将从DS填补:DX + 2 + n,其中我的输入(其中n是包括 '\ R' 输入的字符的数目)

我的问题是,现在,我该怎么做这个。 我刚刚通过x86汇编语言参考看了一遍,但一直没能找到什么有用呢。

代码我已经走到这一步,

           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

Answer 1:

这DOS功能检索与用户输入的缓冲区。 看到这个表 。 看来,程序正在使用该调用暂停执行等待用户恢复计划。

编辑:我只是重读问题。 我还以为你只问什么函数调用在给定的源一样。 如果你想读不超过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

如何转换为大写留给读者。



Answer 2:

这说明说你把一个缓冲区的地址ds:dx调用中断前。 然后中断将填补这一缓冲区读取的字符。

调用中断之前,缓冲区的第一个字节是缓冲区可以有多少个字符持有,或在您的案件20。 我不明白的缓冲器(输入到中断)的第二个字节的描述,所以我会把它设置为零。 在返回时,该字节会告诉你输入的字符是如何被读取并放置到缓冲区。



Answer 3:

.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           


文章来源: I don't understand how to use Interrupt 21, AH=0ah