如何从 DOSBox 中的汇编程序 运行 将文本插入剪贴板?

How can I insert text in the clipboard from an assembly program running in DOSBox?

我在程序集中有一个包含字符串的 db 变量,如下所示:

STR_VAR db 'test$'

是否可以将此变量复制到剪贴板,以便当用户在另一个程序(例如word)中按Ctrl+V时,它会将文本粘贴到变量中。

编辑: 重要信息: 我正在使用 DOSBox 运行 代码

实际上有一个用于 DOS 的官方 API 用于访问主机的剪贴板,在 Windows 3.x 和 9x 中支持。它在文章 Q67675 中有简要描述,以前在 Microsoft 的知识库中。

这是一个代码示例(NASM 语法):

org 0x100

        mov     ax, 0x1700   ; IdentifyWinOldApVersion
        int     0x2f
        cmp     ax, 0x1700
        jz      error

        mov     ax, 0x1701   ; OpenClipboard
        int     0x2f
        test    ax, ax
        jz      error

        mov     ax, 0x1709   ; ClipboardCompact
        mov     cx, STR_VAR.end - STR_VAR
        xor     si, si
        int     0x2f
        cmp     dx, si
        jb      error
        ja      .fits
        cmp     cx, ax
        jb      error

.fits:
        mov     ax, 0x1703   ; SetClipboardData
        mov     dx, 7        ; CF_OEMTEXT
        mov     bx, STR_VAR
        ; ES and SI:CX already set up
        int     0x2f
        test    ax, ax
        jz      error
        
        mov     ax, 0x1708   ; CloseClipboard
        int     0x2f

        mov     ax, 0x4c00
        int     0x21

error:
        mov     ax, 0x4c01
        int     0x21

STR_VAR:
        db      'test'
.end:

我非常怀疑香草 DOSBox 是否真的支持这个 API(尽管它显然在 DOSBox-X 中得到支持,一个分支)。

在 TASM 语法中,您需要进行一些添加和更改,以便它适用于最新的 DOSBOX-X。 这是最终的工作版本

IDEAL
MODEL small
STACK 100h
DATASEG

STR_VAR DB 'test',0
CODESEG
start:
    mov ax, @data
    mov ds, ax

        mov     ax,  1700h   ; IdentifyWinOldApVersion
        int     2fh
        cmp     ax,  1700h
        jz      error_2

        mov     ax,  1701h   ; OpenClipboard
        int     2fh
        test    ax, ax
        jz      error_2

        mov     ax,  1709h   ; ClipboardCompact
        mov     cx, 5  ; STR_VAR.end - STR_VAR
        xor     si, si
        int     2fh
        ;cmp     dx, si
        ;jb      error_2
        ;ja      fits
        cmp dx, 0
        jne fits
        cmp ax, 0
        je error_2
        jmp fits
        cmp     cx, ax
        jb      error_2

fits:
        mov     ax,  1703h   ; SetClipboardData
        mov     dx, 7        ; CF_OEMTEXT
        mov     bx, offset STR_VAR
        ; ES and SI:CX already set up
        push ds
        pop es
        int     2fh
        test    ax, ax
        jz      error_2
        
        mov     ax,  1708h   ; CloseClipboard
        int     2fh


       mov     ax,  4c00h
        int      21

error_2:
        mov     ax,  4c01h
        int      21

exit:
    mov ax, 4c00h
    int 21h
END start