. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->第一个程序
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  利用程序段前缀psp重定向输出  [待解决] 回复[ 5次 ]   点击[ 669次 ]  
cnhnyu
[帖 主]   [ 发表时间:2009-01-19 17:26 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2007-10-22 14:47
程序段前缀PSP格式如下:
偏移     字节数     说 明
0000     02      中断20H
0002     02      以节计算的内存大小(利用这个可看出是否感染引导型病毒)
0004     01      保留
0005     05      至DOS的长调用
000A     02      INT 22H 入口 IP
000C     02      INT 22H 入口 CS
000E     02      INT 23H 入口 IP
0010     02      INT 23H 入口 CS
0012     02      INT 24H 入口 IP
0014     02      INT 24H 入口 CS
0016     02      父进程的PSP段值(可测知是否被跟踪)
0018     14      存放20个SOFT号
002C     02      环境块段地址(从中可获知执行的程序名)
002E     04      存放用户栈地址指针
0032     1E      保留
0050     03      DOS调用 ( INT 21H / RETF )
0053     02      保留
0055     07      扩展的FCB头
005C     10      格式化的FCB1
006C     10      格式化的FCB2
007C     04      保留
0080     80      命令行参数长度(不包含总为最后的0D)及参数
         也是程序运行期间缺省的DTA

现在, 我要利用18H偏移以及80H偏移, 将命令行参数写入一个文件, 完整代码如下:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; filename: psp4.asm                                         ;
; function: write the command line param to a file           ;
; usage:   psp4.exe hello, welcome                           ;
;          then you will get a file psp4.txt with content:   ;
;        hello, welcome                               ;
; author: thinker                                            ;
; e-mail: cnhnyu@gmail.com                                   ;
; qq: 94483026                                               ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
data segment
    szbuf        db 128 dup(24h)
    filename    db 'psp4.txt',0
data ends

stack segment stack
    db    200h dup(0)
stack ends

code segment
    assume cs:code, ds:data, ss:stack

main proc
    mov    ax, data
    mov    ds, ax

    ; open or create a file
    mov    ax, 3c00h
    xor    cx, cx
    lea    dx, filename
    int    21h
    jb    Over
    mov    bx, ax ; store the file handle to bx

    mov    si, 18h ; psp SOFT offset
    mov    al, es:[si+bx]
    mov    es:[si+1], al ; change the standard SOFT as file handle SOFT

    xor    cx, cx
    xor    si, si
    mov    cl, es:[80h] ; get the command line length
    dec    cl
      ; copy the command line from psp[82h] to szbuf
      L:
    mov    al, es:[82h+si]
    mov    [si], al
    inc    si
    loop    L

    ; write the szbuf content to the standard output
    ; but we changed the standard output SOFT to a file handle SOFT
    ; so in fact, it writes to the file
    mov    dx, offset szbuf
    mov    ah, 9
    int    21h

    mov    al, 1
    mov    es:[si+1], al

    mov    ah, 3eh
    int    21h

     Over:
    mov    ax, 4c00h
    int    21h

main endp

code ends
    end main

程序利用psp的14H偏移, 修改原有的标准输出的句柄, 把它改成自己创建文件的句柄, 然后再利用psp的80H偏移,获取命令行参数以及长度, 然后把获取的命令行参数内容拷贝到缓冲区, 最后利用dos的21h号中断的4ch号功能, 将内容写入文件。

本来dos的21号中断的4ch号功能是往标准输出写入内容的,这样我们就能在屏幕上看到, 可是这里, 我修改了标准输出的原有句柄为我建立的文件句柄, 于是这个中断就把内容写入了我建立的文件,从而实现了输出的重定向。 

psp的功能是相当强大的, 利用它, 可以写出不少有用的程序。
cnhnyu
[第1楼]   [ 回复时间:2009-01-19 17:29 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2007-10-22 14:47
程序编译成功后, 在命令行输入:
psp4.exe PSP is powerful

如果没有问题, 那么就会在当前的目录下面产生一个psp4.txt的文本文件, 文本文件的内容为:
PSP is powerful
younggay
[第2楼]   [ 回复时间:2009-01-19 17:51 ]   [引用]   [回复]   [ top ] 
荣誉值:273
信誉值:0
注册日期:2008-01-23 20:23
高手!!!
pangguanzhe1314
[第3楼]   [ 回复时间:2010-11-21 13:44 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-09-01 10:19
大牛!!! 膜拜~~
wujizhi000
[第4楼]   [ 回复时间:2010-11-23 08:38 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-10-10 22:51
没看懂楼主这个人。。。
ricecake
[第5楼]   [ 回复时间:2010-12-20 13:41 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-12-15 10:57
mark
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved