主题:直接执行DOS命令的汇编程序
;本程序用于直接执行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
;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