Assembly 如何将DOSBox中运行的汇编程序中的文本插入剪贴板?
我在程序集中有一个包含字符串的db变量,如下所示:Assembly 如何将DOSBox中运行的汇编程序中的文本插入剪贴板?,assembly,x86,clipboard,dos,dosbox,Assembly,X86,Clipboard,Dos,Dosbox,我在程序集中有一个包含字符串的db变量,如下所示: STR_VAR db 'test$' 是否可以将此变量复制到剪贴板,以便当用户在另一个程序(如word)中按Ctrl+V时,将文本粘贴到变量中 编辑: 重要信息: 我正在使用DOSBox运行代码实际上有一个官方的DOS API,用于访问主机的剪贴板,在Windows 3.x和9x中受支持。这篇文章(以前在Microsoft的知识库中)对此进行了简要描述 下面是NASM语法的代码示例: 组织0x100 mov-ax,0x1700;Identif
STR_VAR db 'test$'
是否可以将此变量复制到剪贴板,以便当用户在另一个程序(如word)中按Ctrl+V时,将文本粘贴到变量中
编辑:
重要信息:
我正在使用DOSBox运行代码实际上有一个官方的DOS API,用于访问主机的剪贴板,在Windows 3.x和9x中受支持。这篇文章(以前在Microsoft的知识库中)对此进行了简要描述 下面是NASM语法的代码示例: 组织0x100 mov-ax,0x1700;IdentifyWinOldApVersion int 0x2f cmp ax,0x1700 jz错误 mov-ax,0x1701;打开剪贴板 int 0x2f 测试ax,ax jz错误 mov-ax,0x1709;剪贴簿 mov cx,STR_VAR.end-STR_VAR 异或硅,硅 int 0x2f cmp-dx,si jb错误 是的,很合适 cmp cx,ax jb错误 .适合: mov-ax,0x1703;设置剪贴簿数据 mov-dx,7;原文 mov bx,STR_VAR ; ES和SI:CX已设置 int 0x2f 测试ax,ax jz错误 mov-ax,0x1708;关闭剪贴板 int 0x2f mov ax,0x4c00 int 0x21 错误: mov-ax,0x4c01 int 0x21 STR_VAR: db“测试” (完)
然而,我很怀疑vanilla DOSBox是否真的支持此API,尽管DOSBox-X(一种fork)显然支持此API。实际上有一个官方的DOS API,用于访问主机的剪贴板,在Windows 3.X和9x中受支持。这篇文章(以前在Microsoft的知识库中)对此进行了简要描述 下面是NASM语法的代码示例: 组织0x100 mov-ax,0x1700;IdentifyWinOldApVersion int 0x2f cmp ax,0x1700 jz错误 mov-ax,0x1701;打开剪贴板 int 0x2f 测试ax,ax jz错误 mov-ax,0x1709;剪贴簿 mov cx,STR_VAR.end-STR_VAR 异或硅,硅 int 0x2f cmp-dx,si jb错误 是的,很合适 cmp cx,ax jb错误 .适合: mov-ax,0x1703;设置剪贴簿数据 mov-dx,7;原文 mov bx,STR_VAR ; ES和SI:CX已设置 int 0x2f 测试ax,ax jz错误 mov-ax,0x1708;关闭剪贴板 int 0x2f mov ax,0x4c00 int 0x21 错误: mov-ax,0x4c01 int 0x21 STR_VAR: db“测试” (完)
然而,我非常怀疑vanilla DOSBox是否真的支持此API,尽管DOSBox-X(一种fork)显然支持此API。在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
在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
操作系统中的操作系统?我使用的是windows,但我在DosBox中运行代码,DOS是否有剪贴板?看起来不是这样,但我不记得了。看起来这个功能是最近添加到dosbox的,请参阅。有一个CLIP$设备,显然也支持旧的Windows 3.1 API。@ItaiElidan:请编辑您的问题,以包含您正在谈论的dosbox的重要信息,并添加标签。否则,人们可能会认为这个问题不清楚,就投反对票。@NateEldredge DOSBox-X≠ 操作系统中的DOSBox.OS?我使用的是windows,但我在DosBox中运行代码,DOS是否有剪贴板?看起来不是这样,但我不记得了。看起来这个功能是最近添加到dosbox的,请参阅。有一个CLIP$设备,显然也支持旧的Windows 3.1 API。@ItaiElidan:请编辑您的问题,以包含您正在谈论的dosbox的重要信息,并添加标签。否则,人们可能会认为这个问题不清楚,就投反对票。@NateEldredge DOSBox-X≠ DOSBox。嘿,如果你能用TASM语法回答我会有帮助的。谢谢,如果你能用TASM语法回答我会有帮助的。谢谢