简体   繁体   English

如何从 FASM 执行 DOS 的 COMMAND.COM 命令?

[英]How to execute DOS' COMMAND.COM command from FASM?

Is there any DOS function to execute string, containing command.com's line?是否有任何 DOS function 执行字符串,包含 command.com 的行? I need something like C's system() , but for DOS and FASM.我需要类似 C 的system()之类的东西,但适用于 DOS 和 FASM。

I've previously used code like this to execute DOS shell commands.我以前使用过这样的代码来执行 DOS shell 命令。 It's for nasm, but you might be able to adapt it for your purposes.它适用于 nasm,但您可以根据自己的目的对其进行调整。 This code specifically executes our own command line tail as a DOS command, but you can patch in some other command line tail if you want to execute a different command.这段代码专门将我们自己的命令行尾部作为 DOS 命令执行,但如果您想执行不同的命令,可以修补其他一些命令行尾部。

section .data
comspec db      "COMSPEC="      ; for finding COMSPEC in the env block
comlen  equ     $-comspec
command db      "COMMAND.COM",0

        ; EXEC parameter block
execpar dw      0               ; environment for child (use ours)
        dw      80h, 0h         ; command tail (use ours)
        dw      5Ch, 0h         ; first FCB (use ours)
        dw      6Ch, 0h         ; second FCB (use ours)

section .text
        ; execute DOS command
doexec:
        mov     bx, execpar     ; EXEC parameter block
        mov     [bx+4], cs      ; fix up segment for command tail
        mov     [bx+8], cs      ; fix up segment for first FCB
        mov     [bx+12], cs     ; fix up segment for second FCB

        call    fndcom          ; write pointer to COMSPEC value to DS:SI
        mov     dx, si
        mov     ax, 4B00h       ; LOAD AND EXECUTE PROGRAM
        int     21h
        jnc     .ok             ; error occured?

        push    ax              ; remember error code
        call    fndcom          ; find COMSPEC value anew
        pop     ax              ; restore error code
        call    perror          ; print error message

.ok:    push    cs              ; restore ds
        pop     ds

        ret

        ; find COMSPEC in the environment block
        ; and load pointer to it to DS:SI
        ; preserves bx
fndcom: mov     ds, [2Ch]       ; environment block
        xor     si, si          ; beginning of env block

        ; loop invariant: si points to the beginning of
        ; a string in the environment
.loop1: cmp     byte [si], 0    ; end of environment reached?
        je      .nope

        mov     di, comspec     ; find "COMSPEC="
        mov     cx, comlen      ;
        repe    cmpsb           ; compare strings
        je      .found          ; if found, we are done

        dec     si              ; go back to mismatched character
.loop2: lodsb                   ; search si for end of string
        test    al, al          ; end of string reached?
        jne     .loop2          ; nope

        jmp     .loop1          ; check next string in environment

        ; COMSPEC unset
.nope:  push    cs
        pop     ds              ; restore ds
        mov     si, command     ; "COMMAND.COM"
        ret

        ; COMSPEC found
.found: ret

The basic idea is to find the name of the command interpreter by searching for a variable named COMSPEC in the environment block.基本思想是通过在环境块中搜索一个名为COMSPEC的变量来找到命令解释器的名称。 If none is found, we default to COMMAND.COM .如果没有找到,我们默认为COMMAND.COM Then, we build an exec parameter block with useful details for the program we would like to execute, including the command line.然后,我们构建一个exec 参数块,其中包含我们想要执行的程序的有用详细信息,包括命令行。 This is where you need to put the shell command to be executed (in the format of a command line tail).这是您需要放置要执行的 shell 命令的地方(以命令行尾部的格式)。 Finally, we invoke DOS function 4b00: execute program to execute the command interpreter, running our command.最后,我们调用DOS function 4b00:执行程序来执行命令解释器,运行我们的命令。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM