11

我的信息来自这里。该作业要求一个程序读取不超过 20 个字符,将这些字符转换为大写,然后将输入打印为大写。

我不知道如何从 int21/AH=0ah 访问输入。除非我了解上面链接的内容,否则我真的无法提出更准确的问题。有人可以解释吗?另外,如果这有什么不同,我正在使用 TASM。另外,我正在freedos上对此进行测试。

更新1:

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

设置: 我必须指定一个 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
4

3 回答 3

9

该 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

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

于 2012-11-03T06:33:02.173 回答
2

该描述说您ds:dx在调用中断之前将缓冲区的地址放入。然后,中断将用它读取的字符填充该缓冲区。

在调用中断之前,缓冲区的第一个字节是缓冲区可以容纳多少个字符,或者在您的情况下为 20 个。我不明白缓冲区第二个字节的描述(在中断的输入上),所以我将它设置为零。返回时,该字节将告诉您读取了多少输入字符并将其放入缓冲区。

于 2012-11-03T06:47:37.093 回答
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           
于 2014-01-25T02:11:19.543 回答