;本程序用于直接执行DOS命令
;usakq12345@gmail.com收集
    .MODEL SMALL
    .STACK

    .DATA

cmd    db    lcmd_lin-1
cmd_lin    db    'dir',0dh
lcmd_lin equ    $-cmd_lin

msg1    db    'Calling DOS Execute interrupt',10,13,'$'
msg2    db    'Return from Execute interrupt',10,13,'$'

    .CODE
old_sp    dw    ?
old_ss    dw    ?

start:    mov    ax,@data
    mov    ds,ax            ;初始化数据段
    lea    dx,msg1            
    mov    ah,09h            ;显示信息
    int    21h            
    call    pause            
    mov    bx,seg end_seg        ;取程序结尾的段地址
    mov    ax,es            ;ES是PSP的段地址
    sub    bx,ax            ;BX是新长度(以节计,1节=16个字节)
    mov    ah,4ah            ;修改已分配的内存空间
    int    21h            
    jc    exit            ;错误则退出

    push    ds            ;保存DS
    mov    cs:old_sp,sp        ;保存堆栈地址
    mov    cs:old_ss,ss

    lea    si,cmd            ;DS:SI 是命令行地址
    int    2eh            ;执行!

    cli                ;关中断
    mov    sp,cs:old_sp        ;恢复堆栈地址
    mov    ss,cs:old_ss
    sti                ;开中断

    pop    ds            ;恢复DS
    lea    dx,msg2            
    mov    ah,09h            
    int    21h

exit:    mov    ax,4c00h        
    int    21h            

pause    proc    near
    mov    ah,07h            
    int    21h            
    ret
pause    endp

end_seg    segment
end_seg    ends
    end    start