在DOS中设置DS并使用AH = 0Ah

时间:2016-12-05 16:22:57

标签: assembly x86-16 dos

所以我试图在DOS程序集中获取用户输入,但我似乎无法理解如何以某种方式设置DS和DX,以便缓冲的输入中断写入右侧地点。这是我的主文件的代码:

BITS 16
org 0x100

Start:

; SNIP

mov dx, Name
call GetString

; SNIP

Exit:
mov ax, 0x4c00
int 0x21

Name:
        db 33
        db 0
        times 255 db 0

这是我的GetString程序,它来自另一个文件。我打算让它在调用函数之前设置DX,然后让DX指向实际字符串的开头:

GetString:
push ax
push bx
; syscall
mov ax, 0x0a
int 0x21
mov bx, dx ; move buffer to adressing register
inc bx ; get number of chars read 
movzx si, [bx] ; put bx's value (numbers of chars read) into si
inc bx ; get actual string buffer
add si, bx ; number of chars read + buffer = last byte
mov byte [si], '$' ; $ terminate
mov dx, bx
pop bx
pop ax
ret

我似乎无法理解为什么它不起作用。我是否应该将DS设置为某种东西,如果是的话是什么?

1 个答案:

答案 0 :(得分:4)

GetString你有

mov ax, 0x0a
int 0x21

这会加载ah 00al 0ah}并调用中断21h函数00h,即"终止程序"

如果您打算调用函数0ah"缓冲STDIN输入"你需要

mov ah, 0x0a
int 0x21

DS:DX一起指向初始缓冲区,就像你一样。