⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gs02.txt

📁   原来一些32位版发表在 http://www.x86asm.com   因暂停。更新的版本改上传于你处。    在原来的基础上。 增加了简单的宏指令. 增加了链接分散的汇编文本能力. 增加
💻 TXT
📖 第 1 页 / 共 2 页
字号:



    新增了宏指令,链接汇编,以及较完备的32位寻址汇编.


 INCLUDE  导入基本数据GS02.TXT


.code     代码段

 CALL 初始化   这些几乎可以不管了.
 JMP DW 内操  



初始化
 MOV EBP,总领
 INC [EBP+总领末]
   XXX  MOV [EBP+基本ESP],ESP  这是以后要做的.

 SUB EAX,EAX
 CALL 铺空间   计算要用的铺大小.
 ADD EDX,300      再加点.
 PUSH -1:POP EAX
 CALL 分配映象    放置句柄集的映象本身句柄不能在句柄集中!
 MOV [EBP+自身句柄],EBX
 CMP AL,0
 JZ +2
 ADD EAX,100
 MOV AL,0    取整
 CALL 铺空间

 PUSH DW 开文对话结构区
 CALL [开文对话函]
 OR EAX,EAX  AX好象为选中的文件数量.
 JZ DW 退出
 MOV ESI,缓冲文件名
 MOV EDI,中央文件名
 MOVSB
 CMP [ESI-1],0    文件名存放.
 JNZ -1

 CALL 文件铺
 MOV EDI,[EBP+书笺首]
 MOV [EBP+文首],EAX
 STOSD
 MOV [EBP+文长],EBX
 MOV [EBP+文尾],EDX
 MOV [EDI],EDX

     其它初始化数据.

 MOV [EBP+总基址],400000

 MOV EAX,[EBP+缓数值址]
 MOV [EBP+原缓数值址],EAX
 
 MOV EAX,[EBP+产首]
 MOV EDI,EAX
 NEG EDI
 MOV [EBP+段基差],EDI
 ADD EDI,[EBP+总基址]
 MOV [EBP+段差],EDI
 MOV [EBP+产正],EAX   没有册正
 MOV [EBP+绣正],EAX
 MOV EDI,EAX

 MOV ESI,[EBP+文首]  源文件址   返回的句柄同时也是地址
 RET



存盘退出
 MOV EBP,函领  
 MOV EBX,总领
 MOV ESI,中央文件名
 PUSH ESI
 LODSB
 CMP AL,0
 JNZ -1
 CMP [ESI-5],"."
 JNZ DW 异常退出   一般不会
 MOV [ESI-5],".EXE"

 POP ESI
 PUSH ESI   中央文件名
 CALL [EBP+删文件函]
 PUSH 0
 PUSH 80
 PUSH 4   强制新建??
 PUSH 0
 PUSH 3
 PUSH C0000000
 PUSH ESI   中央文件名
 CALL [EBP+开文函]    返回句柄EAX=8
 PUSH EAX    这是产号

 PUSH 0
 PUSH 实际产长   返回用的实际产长址
 PUSH [EBX+产长]
 PUSH [EBX+产首]
 PUSH EAX             目标文件句柄
 CALL [EBP+写文件函]
         已经压入了  PUSH [EBX+产号]
 CALL [EBP+关句柄函]

    关闭所有句柄
 MOV ESI,[EBX+句柄首]
 LODSD
 PUSH EAX
 CALL [EBP+关句柄函]
 CMP ESI,[EBX+句柄尾]
 JB -3
 PUSH [EBX+自身句柄]  句柄集本身所在的句柄.
 CALL [EBP+关句柄函]


空间异常
文件异常
异常退出
退出
 PUSH 0
 CALL [ExitProcess]  退出函
 NOP




内操
 CALL 等待内容  内容到齐
 JMP DW 后期
 NOP
 NOP




 取串,判16制,写16制.

  X 总长乘以3/4+2000,再 产:1/4,绣1/4,册1/2

退至后期
 POP EAX
 RET



  数引连续以及冒号连续.

不停地取串   连续取串      
 CALL 读可延符
 JBE 废行
 CMP AL,":"  一般,只要冒号后不为空格,就可延取.
 JZ +2
 CALL 英界符检查
 JB 不停地取串
 CALL 读1字节   并不增长
 CMP AL,20
 JBE 废行
 CALL 英界符取串  是否还有串
 JB 废行  无串
 RET

消行回
 POP EAX
 PUSH 各内容
废行
 CALL 登绣  注册绣
消行
 CALL 读一字节   等于也不行.例如,2:5-6,显示5-7,7不可读.
 JAE 继消行

减书笺    最初: 书笺首=书笺尾.
 MOV EBX,[EBP+书笺尾]
 CMP EBX,[EBP+书笺首]
 JZ 退至后期   进入后期处理 读的子程序中已经调好.
 SUB EBX,8
 MOV [EBP+书笺尾],EBX
 PUSH [EBX+4]:POP [EBP+文尾]
 MOV ESI,[EBX]   原文正
 MOV [EBP+文首],ESI  假文首,减测必须要的.
 JMP 消行

继消行
 CMP AL,A
 JNZ 消行
 CALL 英界符取串
 JB 废行  无串
 RET

等待内容
串识返回
 CALL 不停地取串  以后加一个直接消行?
 NOP
各内容
 JNZ +2
 CALL 连写引号串
 JB 串识返回 
 CALL 特符串
 JB 串识返回
 CALL 写叮指令
 JB 串识返回
 CALL 写多指令
 JB 串识返回
 CALL 连写16制串  重新数引  数引后取串的内容型.
 JB 串识返回  数引写成功了
 CALL 写简指令
 JB 串识返回
 NOP

 CALL 写特指令
 JB 串识返回
 NOP
 CALL 查宏指令
 JB 串识返回
 NOP
 CALL 废行   都不认识的内容. 登记绣
 JMP 各内容    循环


无宏指令
 POPAD   可供恢复继续其它的
 CLC
 RET
查宏指令
 PUSHAD
 MOV EDI,ESI   比较子程序中,以EDI为输入串.
 MOV EBX,[EBP+册尾]  从当前倒回到册首找签
 SUB EBX,签枕值
 CMP EBX,[EBP+册首]
 JB 无宏指令
 CALL 签宏比较
 JB -3
     成功找到一个.
 MOV ESI,EDI
 ADD ESI,ECX
 MOV EAX,[EBX+签数]  首
 MOV EDX,[EBX+签壤]  尾
 CALL 增书笺
 POPAD
 MOV ESI,[EBP+文首]
 STC
 RET  成功

增书笺  输入:EAX新首,EDX新尾.在include和宏macro中使用.
 PUSH EDI  书笺尾是当前正在用的,而不同于其它尾.
 MOV EDI,[EBP+书笺尾]    例如,册尾则是当前正没用到的.
 CMP EDI,[EBP+书笺界]
 JA DW 空间异常
 MOV [EDI],ESI  原书正存放  返回一般消行了.
 ADD EDI,8       新的书笺尾
 MOV [EBP+书笺尾],EDI
 STOSD   EAX为新书首
 MOV [EBP+文首],EAX
 MOV [EDI],EDX  新书尾
 MOV [EBP+文尾],EDX
 XCHG EAX,ESI
 POP EDI
 RET





写特指令  码名成功后,内部不可重复.
 PUSHAD
 MOV EBX,特指令集
 MOV [EBP+原产正],EDI
特指令环
 MOVZX EAX,BY [EBX]
 INC EBX
 TEST EAX,EAX
 JZ 特指令回  结束,正好是CLC
 CMP ECX,EAX
 JNZ 继找特指令
 PUSHAD
 MOV EDI,EBX
 REP:CMPSB:POPAD
继找特指令
 LEA EBX,[EAX+EBX]
 JZ +2
 ADD EBX,4
 JMP 特指令环

    XXX    ADD ESI,ECX  名称成功
 JMP [EBX]  压了一次大栈后进入的.
  XXX  JB 如果特指令回成功结束. 要求JB,ESI,EDI都已改好!!!!
特指令回
定义宏败
 CLC
 POPAD
 RET


定义宏指令
 ADD ESI,ECX
 CALL 取串
 JB 定义宏败
 CMP DL,'{'
 JNZ 定义宏败   特指令回
 MOV EBX,[EBP+册尾]   准备注册宏签
 MOV [EBX+签性],DW 0
 MOV [EBX+签性顶],10
 MOV [EBX+签址],ESI
 MOV [EBX+签长],ECX
 MOV [EBX+签符],EDX   DL后符,DH前符.

 ADD ESI,ECX
 MOV [EBX+签数],ESI   首  正指向前大括号符.
 CALL 读一字节
 JB 定义宏败
 CMP AL,'}'
 JNZ -2
 MOV [EBX+签壤],ESI  尾
 LEA EBX,[EBX+签枕]
 MOV [EBP+册尾],EBX
 CMP EBX,[EBP+册界]
 JA DW 异常退出
 POP EDI:POP EAX:PUSH ESI:PUSH EDI   更换ESI
 POPAD:STC:RET  成功返回



引入文件
 ADD ESI,ECX
 CALL 读一字节
 JB 引入文件败
 CMP AL,20
 JB 引入文件败
 JZ -3
 MOV ECX,ESI   文件或路径名中的第1字节
 DEC ECX
 CALL 读一字节   第1个字节也可用于检查引号
 JB 引入文件败
 CMP [ESI-4],".TXT"  目前简单的为此.
 JZ +5     加强的,引号.DLL或.INC等以后处理.
 CMP AL,20
 JAE -4
引入文件败
 CLC
 POPAD
 RET

 CMP [ESI],20   .ASM后的字符最好要小于等于20才可以.
 JA 引入文件败
 XCHG ECX,ESI
 SUB ECX,ESI
 PUSH EDI
 MOV EDI,缓冲文件名
 REP:MOVSB
 MOV [EDI],0
 POP EDI
 CALL 文件铺
 CALL 增书笺
 POPAD
 MOV ESI,[EBP+文首]
 STC
 RET  成功

 


导表指令败
 POPAD:CLC:RET

导入表指令
 CMP DL,"{"
 JNZ 引入文件   或导表指令败   特指令回   
 CALL 检PE头部
 MOV ECX,[EBP+PE段正]
 TEST BY [ECX+24],40  当前段是否数据段.
 JNZ +1  
 CALL 添数据段
 ADD EBX,78   EBX由PE领改向了目录领.从0号目录开始.
 CMP DW [EBP+导函总数],0
 JNZ DW 异常退出     简单的进行数据的安全检查.
 CALL 统计函串
 CALL 算函串位置 
 CMP DW [EBP+导函总数],0
 JZ DW 异常退出
 CALL 写库函串
 POP EAX:POP EAX:PUSH ESI:PUSH EDI
 MOV EDI,[EBP+段基差]   库函收尾,征募和表尾写0.
 NEG EDI
 CALL 写征募函
 MOV EDI,[EBP+导表正]
 MOV ECX,14   EAX已是0. SUB EAX,EAX
 REP:STOSB
 POPAD:STC  表示成功返回
 RET


检PE头部
 MOV EBX,[EBP+PE领]
 TEST EBX,EBX
 JNZ PE头部回   说明已有头部数据取到.
 MOV EBX,[EBP+产首]
 CMP EDI,EBX
 JNZ 取PE头数据    如果用户手工头部,将直接去取.
 MOV ECX,E0
 PUSH ESI
 MOV ESI,400000   其实是复制编译器自己本身的头部.
 REP:MOVSB:POP ESI
 MOV [EDI-7A],000   段数目
 SUB EAX,EAX
 MOV ECX,48      100为80,4:40
 REP:STOSD    目前写到200处. 最多只许四个段
取PE头数据
 MOV EAX,[EBX+3C]
 ADD EBX,EAX   WIN头部
 MOV [EBP+PE领],EBX
 MOV EAX,[EBP+产首]
 MOV [EBP+段文正差],EAX
 NEG EAX
 MOV [EBP+段基差],EAX
 MOV ECX,[EBX+34]  
 MOV [EBP+总基址],ECX
 ADD EAX,ECX
 MOV [EBP+段差],EAX
 MOV EAX,[EBX+74]    目录数量
 LEA EAX,[EBX+8*EAX+78]
 MOV [EBP+PE段领],EAX
 MOV [EBP+PE段正],EAX  无效.
PE头部回
 RET


统计函串
 PUSH ESI
统计函串中
 CALL 读一字节   也没有检查很多的额外符号.
 JB 统计函串回     简单的废行取串
 CMP AL,A
 JNZ -2  消行
继统计函串
 CALL 英界符取串
 JB 统计函串中
 CMP AL,A
 JZ 统计函串中
 INC DW [EBP+导函总数]
 CMP DL,"."
 JNZ +1
 INC DW [EBP+导库数]
 ADD ESI,ECX
 CMP DL,","
 JZ 继统计函串
 CMP DL,"}" 登记结束. 
 JNZ 统计函串中
统计函串回
 POP ESI
 RET

算函串位置
 MOV EAX,EDI
 MOV [EBP+征函正],EAX
 MOV ECX,[EBP+导函总数]
 SHL ECX,2      *4
 ADD EAX,ECX
 MOV [EBP+募函正],EAX
 ADD EAX,ECX
 MOV [EBP+导表正],EAX
 MOV EDX,[EBP+导库数]
 INC EDX
 6BD214  IMUL EDX,EDX,14   *4*5
 ADD EAX,EDX
 MOV [EBX+C],EDX     导入表的长度
 MOV [EBP+库函串正],EAX
 RET

写库函串
 MOV EDI,[EBP+库函串正]
写库函串中
 CALL 读一字节   也没有检查很多的额外符号.
 JB 写库函串回     简单的废行取串

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -