汇编push ds;sub ax,ax;push ax和ret的作用

来源:互联网 发布:windows微软账户被禁用 编辑:程序博客网 时间:2024/06/01 07:50

源地址:http://mazaoliang.blog.163.com/blog/static/138455093201131471338764/

程序加载后,DS存放着程序所在内存的段地址,这个内存区域的前256个字节存放在的是PSP。

PSP:程序段前缀,是DOS操作系统在执行程序时为程序所建立的一个信息块,   里面包括了传递给待运行程序的命令行参数,   程序运行结束时返回DOS所需的地址等有用的信息.  


汇编程开始时

push ds

sub ax,ax

push ax 这三条语句是为后面的ret做准备,ret即执行pop ip, pop cs,执行完ip的值为0,cs的值为ds。程序转移到程序PSP的起始地址,起始地址的前两个字节放的是int 20指令,用于返回DOS。

不过不推荐这样做,现在常用

mov ax 4c00h

int 21h;终止程序,返回值为al.

 

**程序示例1:

code segment

main proc far

    assume cs:code,ds:data 

start:

    push ds

    sub ax,ax

    push ax

 

    ret ;; return to DOS

main endp

code ends

end start

 

如图,查看程序PSP的部份内容

汇编push ds;sub ax,ax;push ax和ret的作用 - Enjoylifemzl_大二ing - 计算机专业大二ing_linux_c
 

**程序示例2:

start:

    push ds

;int 21h;  CD N是int n 的机器码

;int 10

    sub ax,ax

    push ax

汇编push ds;sub ax,ax;push ax和ret的作用 - Enjoylifemzl_大二ing - 计算机专业大二ing_linux_c
 


程序段前缀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

一个操作示例:

D:\Masm615>dir jch           ;显示计算阶乘的程序

   Volume in drive D has no label
Volume Serial Number is 18F0-186B
Directory of D:\Masm615

JCH    OBJ        371 04-10-03 20:58 JCH.obj
JCH    ASM      3,637 04-03-03 20:46 jch.asm
JCH    COM     12,486 04-10-03 20:58 Jch.com
       3 file(s) 16,494 bytes
       0 dir(s) 915,632,128 bytes free

D:\Masm615>
jch 7             ;计算7的阶乘
5040
D:\Masm615>
debug jch.com 7   ;DEBUG查看命令行参数情况
-
d80 L10                     ;可看出命令行参数长度为02,参数是:2037 0D
128D:0080
 02 20 37 0D 68 2E 63 6F-6D 20 37 0D 00 00 00 00 . 7.h.com 7.....
-
-
D0 7F                       ;显示PSP数据
128D:0000
 CD 20 00 9D 00 9A F0 FE-1D F0 4F 03 F2 0B 8A 03
128D:0010 F2 0B 17 03 F2 0B
 E1 0B-01 01 01 00 02 FF FF FF ;父进程的PSP
128D:0020 FF FF FF FF FF FF FF FF-FF FF FF FF
 7E 12 4C 01 ;环境块段地址
128D:0030 F9 0F 14 00 18 00 8D 12-FF FF FF FF 00 00 00 00
128D:0040 07 0A 00 00 00 00 00 00-00 00 00 00 00 00 00 00
128D:0050 CD 21 CB 00 00 00 00 00-00 00 00 00 00 37 20 20
128D:0060 20 20 20 20 20 20 20 20-00 00 00 00 00 20 20 20
128D:0070 20 20 20 20 20 20 20 20-00 00 00 00 00 00 00 00

-
D127E:0                      ;显示环境块的内容(在DOS提示符下可用SET命令查看环境信息)
127E:0000 54 4D 50 3D 43 3A 5C 57-49 4E 44 4F 57 53 5C 54 TMP=C:\WINDOWS\T
127E:0010 45 4D 50 00 54 45 4D 50-3D 43 3A 5C 57 49 4E 44 EMP.TEMP=C:\WIND
127E:0020 4F 57 53 5C 54 45 4D 50-00 50 52 4F 4D 50 54 3D OWS\TEMP.PROMPT=
127E:0030 24 70 24 67 00 77 69 6E-62 6F 6F 74 64 69 72 3D $p$g.winbootdir=
127E:0040 43 3A 5C 57 49 4E 44 4F-57 53 00 50 41 54 48 3D C:\WINDOWS.PATH=
127E:0050 43 3A 5C 57 49 4E 44 4F-57 53 3B 43 3A 5C 57 49 C:\WINDOWS;C:\WI
127E:0060 4E 44 4F 57 53 5C 43 4F-4D 4D 41 4E 44 00 43 4F NDOWS\COMMAND.CO
127E:0070 4D 53 50 45 43 3D 43 3A-5C 57 49 4E 44 4F 57 53 MSPEC=C:\WINDOWS
127E:0080 5C 43 4F 4D 4D 41 4E 44-2E 43 4F 4D 00 77 69 6E \COMMAND.COM.win
127E:0090 64 69 72 3D 43 3A 5C 57-49 4E 44 4F 57 53 00 42 dir=C:\WINDOWS.B
127E:00A0 4C 41 53 54 45 52 3D 41-32 32 30 20 49 35 20 44 LASTER=A220 I5 D
127E:00B0 31 20 54 34 20 50 33 30-30 00 43 4D 44 4C 49 4E 1 T4 P300.CMDLIN
127E:00C0 45 3D 64 65 62 75 67 20-6A 63 68 2E 63 6F 6D 20 E=debug jch.com
127E:00D0 37
 00 00 01 00 4A 43 48-2E 43 4F 4D 00 FF 1E 8E 7....JCH.COM....
                      (环境块中可找到当前执行的程序名)

-d be1:0                ;显示父进程的PSP(利用父进程PSP可测知程序是否被其他程序加载跟踪)
0BE1:0000 CD 20 00 A0 00 9A F0 FE-1D F0 14 03 0F 0A 6D 01 . ............m.
0BE1:0010 0F 0A 78 01 0F 0A
 0F 0A-01 01 01 00 02 FF FF FF ..x.............
0BE1:0020 FF FF FF FF FF FF FF FF-FF FF FF FF CF 0B 2E 3E ...............>
0BE1:0030 EF 0B 14 00 18 00 DE 0B-FF FF FF FF 00 00 00 00 ................
0BE1:0040 07 0A 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
0BE1:0050 CD 21 CB 00 00 00 00 00-00 00 00 00 00 4A 43 48 .!...........JCH
0BE1:0060 20 20 20 20 20 43 4F 4D-00 00 00 00 00 37 20 20 .....COM.....7
0BE1:0070 20 20 20 20 20 20 20 20-00 00 00 00 00 00 00 00 ........
0BE1:0080
 0A 20 6A 63 68 2E 63 6F-6D 20 37 0D 00 00 00 00 . jch.com 7.....
         ;父进程中的命令行参数

另外:保存INT 22/INT 23/INT 24H的值使得用户在程序中可修改这些中断的值,病毒就曾利用这种技术防止不能传染时引起出错信息。在程序退出时根据PSP中保存的值恢复各中断的值。


0 0
原创粉丝点击