各位好,请问是否可以程序获取自身的文件名?

bingking68 2008-05-11 09:14:30
正如标题,程序是否能获取自身的文件名?
期望能通过中断或代码来解决,API除外。
(本人查过中断大全,暂未找相关的中断号)
...全文
136 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
bingking68 2008-05-19
  • 打赏
  • 举报
回复
很多谢各位的解答,不知道这次地震是否有影响到各位呢?
首先,多谢zhouziheng_chang的详细解答,不过,是否能用程序需尝试实现一下。
而hswxf在2楼所讲的方法,本人不太明白。
但在此先作抱歉,所讲的文件偏重于MZ文件(如果可以再讨论PE文件那更好啦!)
baoyuhua 2008-05-13
  • 打赏
  • 举报
回复
在程序开头esp向上偏移取得命令行参数即可
用户 昵称 2008-05-12
  • 打赏
  • 举报
回复
5F,系统创建的psp段中的文件名和自身的文件名在什么条件下可能不一致?
hswxf 2008-05-12
  • 打赏
  • 举报
回复
3楼说的俺们就糊涂了,与楼主是不是一致呀!
要注意的是:psp是系统为运行的程序创建的,不是程序文件自身所携带的。
与楼主:
正如标题,程序是否能获取自身的文件名?
**************
?文件
用户 昵称 2008-05-12
  • 打赏
  • 举报
回复
3楼的另俺明白了好多。
zhouziheng_chang 2008-05-12
  • 打赏
  • 举报
回复
系统加载程序后,在程序所属psp内有相关信息,可以通过研究psp定位文件名信息,进而获取文件名。

程序加载后,ds中存放着程序所在内存区的段地址,这个内存区的偏移地址为 0 ,则程序所在的内存区的地址为:ds:0;
这个内存区的前256 个字节中存放的是PSP,dos用来和程序进行通信。
从 256字节处向后的空间存放的是程序。
----摘自 王爽《汇编语言》讲稿第四章 4.9 程序执行过程的跟踪

要注意的是:psp是系统为运行的程序创建的,不是程序文件自身所携带的。

例如:
C:\DOCUME~1\ADMINI~1\masm>debug f.exe
-r
AX=0000 BX=0000 CX=002F DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=13E6 ES=13E6 SS=13F6 CS=13F7 IP=0000 NV UP EI PL NZ NA PO NC
13F7:0000 B8F613 MOV AX,13F6
-
-dds:0
13E6:0000 CD 20 FF 9F 00 9A F0 FE-1D F0 4F 03 F4 0D 8A 03 . ........O.....
13E6:0010 F4 0D 17 03 F4 0D E3 0D-01 01 01 00 02 FF FF FF ................
13E6:0020 FF FF FF FF FF FF FF FF-FF FF FF FF A1 13 4C 01 ..............L.
13E6:0030 B4 12 14 00 18 00 E6 13-FF FF FF FF 00 00 00 00 ................
13E6:0040 05 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
13E6:0050 CD 21 CB 00 00 00 00 00-00 00 00 00 00 20 20 20 .!...........
13E6:0060 20 20 20 20 20 20 20 20-00 00 00 00 00 20 20 20 .....
13E6:0070 20 20 20 20 20 20 20 20-00 00 00 00 00 00 00 00 ........
-d
13E6:0080 00 0D 66 2E 65 78 65 0D-20 42 4C 41 53 54 45 52 ..f.exe. BLASTER
13E6:0090 3D 41 30 0D 64 64 72 65-73 73 2E 20 20 46 6F 72 =A0.ddress. For
13E6:00A0 20 65 78 61 6D 70 6C 65-3A 0D 20 6F 6E 20 4E 54 example:. on NT
13E6:00B0 56 44 4D 2C 20 73 70 65-63 69 66 79 20 61 6E 20 VDM, specify an
13E6:00C0 69 6E 76 61 6C 69 64 0D-20 6F 6E 6C 79 2E 0D 00 invalid. only...
13E6:00D0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
13E6:00E0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
13E6:00F0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................


不难看到 ds:0082 就是文件名信息的起始地址。当然,结束为止即可执行文件扩展名.exe之前了(这里所说的文件名不包括文件扩展名,如果包括,只是判断文件名信息结束逻辑的实现问题了)。

深入讨论欢迎进入 汇编网
cnzdgs 2008-05-11
  • 打赏
  • 举报
回复
用C写个程序,
void main(int argc, char* argv[])
argv[0]就是自身。
用反汇编调试可以知道获取的方法。
hswxf 2008-05-11
  • 打赏
  • 举报
回复
通过查询自地址开始处前100H字节处开始的ASSIIC码或EXE文件的位置就行

21,453

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧