Assembly 设置DS并在DOS中使用AH=0Ah
因此,我试图在DOS汇编中获得用户输入,但我似乎不知道如何以某种方式设置DS和DX,以便缓冲输入中断写入正确的位置。以下是我的主文件的代码: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过程,它来自
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使程序不会崩溃,但仍不会停止请求输入。