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

Assembly 设置DS并在DOS中使用AH=0Ah,assembly,x86-16,dos,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过程,它来自

因此,我试图在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设置为某个值,如果是,设置为什么值?

GetString

mov ax, 0x0a
int 0x21
这将加载
ah
00
al
0ah
)并调用中断
21h
函数
00h
,即“终止程序”

如果要调用函数
0ah
“缓冲标准输入”,则需要


以及指向初始化缓冲区的
DS:DX

GetString

mov ax, 0x0a
int 0x21
这将加载
ah
00
al
0ah
)并调用中断
21h
函数
00h
,即“终止程序”

如果要调用函数
0ah
“缓冲标准输入”,则需要


以及指向初始化缓冲区的
DS:DX

“不工作”不是一个好的问题描述。发生了什么,您如何知道它是错的?看起来像“.com”可执行文件,其中所有数据、代码和堆栈都位于单个段中,代码从
0x0100
开始。因此,在代码开始时,您可以执行
push cs
pop ds
cs
复制到
ds
,这应该适用于“.com”(而不是“.exe”)。在某些汇编程序中,您可以使用
MOV AX,@DATA;组装.exe文件时使用MOV DS,AX
。我使用的x86汇编程序也是必需的
MOV dx,偏移量名称
。抱歉,这是一个错误的描述。当调用
GetString
中的中断时,程序基本上停止运行。添加push cs和pop ds使程序不会崩溃,但它仍然不会停止请求输入。“不工作”不是一个好的问题描述。发生了什么,您如何知道它是错的?看起来像“.com”可执行文件,其中所有数据、代码和堆栈都位于单个段中,代码从
0x0100
开始。因此,在代码开始时,您可以执行
push cs
pop ds
cs
复制到
ds
,这应该适用于“.com”(而不是“.exe”)。在某些汇编程序中,您可以使用
MOV AX,@DATA;组装.exe文件时使用MOV DS,AX
。我使用的x86汇编程序也是必需的
MOV dx,偏移量名称
。抱歉,这是一个错误的描述。当调用
GetString
中的中断时,程序基本上停止运行。添加push cs和pop ds使程序不会崩溃,但仍不会停止请求输入。