CODE SEGMENT
ASSUME DS:CODE,CS:CODE,ES:CODE,SS:CODE
.186
ORG 100h
START:
mov bx,offset _END ;↓自分のメモリを確保するための計算
mov cl,4
shr bx,cl
inc bx ;↑ここまで
mov sp,offset _END ;SP設定
mov ah,4Ah
int 21h ;自分のメモリ確保
xor ax,ax ;↓パラメータブロック設定
mov PARAM_BLOCK[00],ax
mov PARAM_BLOCK[02],offset CMD_LINE
mov PARAM_BLOCK[04],cs
mov PARAM_BLOCK[06],word ptr 5Ch
mov PARAM_BLOCK[08],es
mov PARAM_BLOCK[10],6Ch
mov PARAM_BLOCK[12],es ;↑ここまで
push word ptr [ds:2Ch]
pop es ;ES <= 環境変数領域のセグメント
call SEARCH_COMSPEC ;'COMSPEC'を探す
or di,di
jnz EXEC ;DI=0 なら環境変数がない
mov ah,9
mov dx,offset ERR_MSG
int 21h ;エラーメッセージ表示
mov ax,4CFFh
int 21h ;異常修了
EXEC:
push es ;↓COMMAND.COM実行の準備
pop ds
push cs
pop es
mov ax,4B00h
mov dx,di
mov bx,offset PARAM_BLOCK
pusha
push ds
push es ;↑ここまで
int 21h ;/C DIR 実行
pop es ;↓次の準備
pop ds
popa
inc byte ptr cs:CMD_LINE
mov cs:CMD_LINE2,byte ptr '\' ;引数'/C DIR \'に設定
;↑ここまで
int 21h ;実行
mov ax,4C00h
int 21h ;終了
SEARCH_COMSPEC:
mov si,offset COMSPEC ;DS:SI <= 検索文字列(COMSPEC)
xor di,di ;ES:DI <= 検索開始位置
SEARCH_COMSPEC2:
cmp [es:di],word ptr 0 ;環境変数領域が終わりか?
jz short SEARCH_NON ;無かった
mov cx,8 ;'COMSPEC'の文字数
push si
repe cmpsb ;ds:si = 'COMSPEC'
;es:di = 環境変数領域
pop si
jnz short SEARCH_COMSPEC2
SEARCH_END:
ret ;見つかった
SEARCH_NON:
xor di,di
ret ;見つからなかった
ERR_MSG db '環境変数「COMSPEC」が設定されていません',0Dh,0Ah,24h
PARAM_BLOCK dw 7 dup(?)
COMSPEC db 'COMSPEC=',0
CMD_LINE db 7,'/C DIR '
CMD_LINE2 db 0Dh,0Dh
dw 30 dup(?)
_END:
ENDS
END START
; 一部のコンパイラでは、
;CODE ENDS
; END START
;と記述しなければいけないようです
|