【发布时间】:2016-12-05 16:22:57
【问题描述】:
所以我试图在 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 设置为什么,如果是,设置为什么?
【问题讨论】:
-
“不起作用”不是一个好的问题描述。会发生什么,你怎么知道是错的?
-
看起来像“.com”可执行文件,所有数据、代码和堆栈都驻留在单个段中,代码以
0x0100开头。所以在代码的开头你可以用push cspop ds将cs复制到ds,这应该适用于“.com”(不适用于“.exe”)。 -
在某些汇编程序中,您可以在汇编 .exe 文件时使用
MOV AX,@DATA; MOV DS,AX。 -
我使用的 x86 汇编器也需要
mov dx, OFFSET Name。 -
Sorry doesn't work 是一个糟糕的描述。当
GetString中的中断被调用时,程序基本上就死了。添加 push cs 和 pop ds 使程序不会崩溃,但它仍然不会停止请求输入。