【问题标题】:Setting DS and using AH = 0Ah in DOS在 DOS 中设置 DS 并使用 AH = 0Ah
【发布时间】: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 dscs复制到ds,这应该适用于“.com”(不适用于“.exe”)。
  • 在某些汇编程序中,您可以在汇编 .exe 文件时使用MOV AX,@DATA; MOV DS,AX
  • 我使用的 x86 汇编器也需要mov dx, OFFSET Name
  • Sorry doesn't work 是一个糟糕的描述。当GetString 中的中断被调用时,程序基本上就死了。添加 push cs 和 pop ds 使程序不会崩溃,但它仍然不会停止请求输入。

标签: assembly x86-16 dos


【解决方案1】:

GetString 你有

mov ax, 0x0a
int 0x21

这会加载ah00al0ah)并调用中断21h 函数00h 这是“终止程序”。

如果你想调用函数0ah "buffered STDIN input" 你需要

mov ah, 0x0a
int 0x21

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-23
    • 2014-04-20
    • 1970-01-01
    • 2016-10-21
    • 2019-03-11
    • 2015-03-20
    • 2017-10-25
    • 1970-01-01
    相关资源
    最近更新 更多