9 assembly dos interrupt bios tasm
我的信息来自这里.该作业要求读取不超过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
Run Code Online (Sandbox Code Playgroud)
该DOS函数检索具有用户输入的缓冲区.见这个表.程序似乎正在使用该调用暂停执行,等待用户恢复程序.
编辑:我刚刚重读了这个问题.我以为你只是询问函数调用在你给定的源代码中做了什么.如果要读取不超过20个字符的输入,首先需要内存来存储它.添加如下内容:
bufferSize db 21 ; 20 char + RETURN
inputLength db 0 ; number of read characters
buffer db 21 DUP(0) ; actual buffer
Run Code Online (Sandbox Code Playgroud)
然后填充缓冲区:
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
Run Code Online (Sandbox Code Playgroud)
如何转换为大写留给读者.