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

📄 gs02.txt

📁   原来一些32位版发表在 http://www.x86asm.com   因暂停。更新的版本改上传于你处。    在原来的基础上。 增加了简单的宏指令. 增加了链接分散的汇编文本能力. 增加
💻 TXT
📖 第 1 页 / 共 2 页
字号:
 CMP AL,A
 JNZ -2  消行
继写库函串
 CALL 英界符取串
 JB 写库函串中
 CMP DL,"."
 JNZ +4
 CALL 写导入表
 ADD ECX,4
 SUB EAX,EAX
 JMP 写库函序名
 CMP AL,A
 JNZ +5
 PUSH EDI
 MOV EDI,[EBP+征函正]
 CALL 注册函定签
 POP EDI
 JMP 写库函串中
 CALL 写征募函
 SUB EAX,EAX
 STOSW
写库函序名
 TEST CL,1
 REP:MOVSB
 JNZ +1
 STOSB  是偶数写两个0,是奇数只写一个.
 STOSB
 CMP DL,","
 JZ 继写库函串
 CMP DL,"}" 登记结束. 
 JNZ 写库函串中
写库函串回
 RET

写征募函
 PUSH EDI
 XCHG EAX,EDI
 ADD EAX,[EBP+段基差]
 MOV EDI,[EBP+征函正] 
 JZ +1    如果是写0,是一次结束标志,不用注册
 CALL 注册函定签
 STOSD
 MOV [EBP+征函正],EDI
 MOV EDI,[EBP+募函正]
 STOSD
 MOV [EBP+募函正],EDI
 POP EDI
 RET


写导入表
 PUSH EDI
 PUSH EDI
 CMP DW [EBX+8],0   在PE头的目录中导入表位置.
 JNZ +4
 MOV EAX,[EBP+段基差]
 ADD EAX,[EBP+导表正]
 MOV [EBX+8],EAX
 JMP +3    首次写导入表
 MOV EDI,[EBP+段基差]
 NEG EDI
 CALL 写征募函
 MOV EDI,[EBP+导表正]
 MOV EAX,[EBP+募函正]
 ADD EAX,[EBP+段基差]
 STOSD
 SUB EAX,EAX
 STOSD:STOSD
 POP EAX   这是库的址.
 ADD EAX,[EBP+段基差]
 STOSD
 MOV EAX,[EBP+征函正]
 ADD EAX,[EBP+段基差]
 STOSD
 MOV [EBP+导表正],EDI
 POP EDI 
 RET




添PE段
 CALL 检PE头部
添数据段
 CALL 补齐段
 CALL 添段内容
 RET

数据段指令
 CALL 添PE段
添段成回
 POP EAX:POP EAX:PUSH ESI:PUSH EDI
 POPAD:STC:RET 

代码段指令
 CALL 添PE段
 MOV [ECX+24],60000020
添代码段回
 MOV EBX,[EBP+PE领]
 MOV EAX,EDI
 ADD EAX,[EBP+段基差]
 MOV [EBX+28],EAX
 MOV [EBX+2C],EAX
 MOV [EBX+30],EAX
 JMP 添段成回
 
混合段指令
 CALL 添PE段
 MOV [ECX+24],E0000060
 JMP 添代码段回

代码入口指令
 MOV EBX,[EBP+PE领]
 MOV EAX,EDI
 ADD EAX,[EBP+段基差]
 MOV [EBX+28],EAX
 POPAD:STC:RET 

补齐PE段
 CALL 检PE头部
补齐段
 MOV EBX,[EBP+PE领]
 MOV EAX,EDI
 SUB EAX,[EBP+产首]  或者另 SUB EAX,[EBP+段文正差]
 PUSH EAX   这是每一个段中,文自己的绝对差.
 SUB EDX,EDX
 DIV DW [EBX+3C]  文齐
 SUB EAX,EAX 
 NEG EDX   即使用户给的对齐值太小,也是不容易溢出的.
 JZ +3
 ADD EDX,[EBX+3C]
 MOV ECX,EDX  只是计算需要补齐的长度.
 REP:STOSB   此时的EDI已是对齐的文址了.
 MOV ECX,[EBP+PE段领]
 666B430628  IMUL AX,[EBX+6],28
 ADD ECX,EAX   段数为0仍为段领,但不写数据.
 TEST EAX,EAX   段数为1以上都写数.
 POP EAX
 JZ PE初始段
 SUB ECX,28
 SUB EAX,[ECX+14]   上一个段其源中位置
 MOV [ECX+8],EAX   上一个段内存中长度
 MOV [ECX+10],EAX  上一个段其源文中长度
 ADD EAX,EDX
 ADD EAX,[ECX+C]  用于计算下一个新段在的内存中的开始位置
 ADD ECX,28  准备建新段
PE初始段
 PUSH EAX
 SUB EDX,EDX
 DIV DW [EBX+38]  内存齐
 NEG EDX
 ADD EDX,[EBX+38]
 POP EAX
 ADD EDX,EAX   内存总的对齐,也是下一个新映段始址.
 MOV EAX,EDI
 SUB EAX,[EBP+产首]  这是下一个新的文段始.
 RET


添段内容
 INC WO [EBX+6] 段数目
 CMP WO [EBX+6],4
 JA DW 异常退出    目前只许4个段
 MOV [EBP+PE段正],ECX
 MOV [ECX+14],EAX   文
 MOV [ECX+C],EDX   内存
 CALL 登记段差
 MOV [ECX+24],C0000040  默认为数据段.
 SUB EAX,EAX
 MOV [ECX+18],EAX
 MOV [ECX+1C],EAX
 MOV [ECX+20],EAX
 PUSH EDI:PUSH ECX
 MOV EDI,ECX
 CALL 取串   指令码的名字. 还在吗? 对于INCLUDE?
 MOV AL,"."  段的名字
 STOSB:REP:MOVSB
 POP ECX:POP EDI
 RET


登记段差      本段基址为EDX,现段0址为EDI.  
 SUB EDX,EDI   本段基X=(现当前址x-现段0址)+本段基址
 MOV [EBP+段基差],EDX    本段基差=本段基址-现段0址
 ADD EDX,[EBP+总基址]   400000  
 MOV [EBP+段差],EDX   本段段差=本段基差+总基址
 MOV [EBP+段文正差],EDI
 RET




不是写叮指令
 CLC
 RET

写叮指令
 CMP DX,2020  前后符都必须是空格
 JNZ 不是写叮指令
 CALL 常用叮
 JB 不是写叮指令
叮领数环
 MOV EBX,EAX
 CALL 取串
 JB 叮消行回
 PUSH EDI
 MOV EDI,[EBP+缓数值址]
 CALL 取引数值   借为败,等为有数. 其它串为不等.
 MOV AH,BH   由于有叮,BH没被变
 POP EDI
 JNZ +2
 CALL 叮缓数入壤
 JMP +2       可以改为允许混合数据.目前没有.略
 OR AH,20   设成用签
 CALL 留符注册签   EBX中保留着叮.EDX中留着前后符.
 CMP DL,','
 JZ 叮领数环
叮消行回
 JMP DW 消行回




特符串  清0定位符, 
 MOV EBX,[EBP+册尾]
 CMP AL,"$"
 JNZ 查顶头串   61
 CALL 判得16制数
 JB 叮消行回     6C
 MOV EAX,[EDI]
 MOV EDX,EDI
 SUB EDX,[EBP+产首]
 SUB ECX,ECX
 MOV CX,AX   这里关闭了对大于64K的清0跨段.
 CMP ECX,EDX
 JZ 符定原地
 JA 符定差数
 MOV CH,0
 MOV DH,0
 CMP CL,DL
 JZ 符定原地  如果比当前址小,将为单字节对齐.
 JA +1
 MOV CH,1
符定差数
 SUB CX,DX
 MOV AL,0
 REP:STOSB
符定原地
 CMP [ESI],','   其后为段或列签定义.
 JNZ 查0符回
 CALL 取串
 JB 查0符回
 CALL 判16制串
 JB 符登段差   这里JB为是16制.
 PUSH EDI
 MOV EAX,EDI
 SUB EAX,[EBP+产首]  计算最近的定位0点标签.
 CBW:CWDE
 SUB EDI,EAX      如果是串,则在此下定义了签.
 MOV AH,12    行10 + 定义签2
 CALL 注册签    伪壤注册签
 POP EDI
 JMP 查0符回   其后一般不取其它串.

符登段差
 CALL 倒取16制数
 MOV EDX,[EDI]
 CALL 登记段差
 JMP 查0符回


查顶头串
 CMP AL,0A
 JNZ 查赋值型串  其它符
 CALL 后断符6种
 JNZ 非法串
 MOV AH,12   位1定02,行10. 顶头签是一种行号定义签.
 CALL 留符注册签
 CMP DL,20
 JNZ 顶头串回
 CALL 取串
 JB 顶头串回
 CALL 常用叮
 JNB DW 叮领数环
查0符回
顶头串回
非法串
 JMP DW 消行回   上两类的和串多余符的,一般应消行.


查赋值型串
 CMP DL,"="
 JNZ 其它临时符
 CALL 前空符4种
 JNZ 非法串    会增其它的特殊定义吗?
 PUSHAD
 CALL 判再取16制数  串已失去
 POPAD
 JB 非法串
 PUSH [EDI]:POP [EBX]    低4字节
 PUSH [EDI+4]:POP [EBX+4]  高4字节
 MOV AH,2    纯定义签
 CALL 注册签
 JMP 非法串  这里目前还不是很好做.

其它临时符
 MOV AH,20   特殊的用签.并且单字节.
 CMP AL,"@"
 JZ 即写符方式
 MOV AH,60   用签,并且4字节
 CMP AL,"%"
 JZ +6
 CMP AL,"!"   数据段
 JZ +4
 CMP AL,"|"   代码段
 JZ +2
 CMP AL,"&"   数据基本段
 JNZ 其它串
即写符方式
 CALL 后断符6种
 JNZ 非法串   不合法
 JMP DW 注册签



其它串
 CLC
 RET



写简指令  STC表示串已用完或无串. CLC则表示串还要继续其它.
 MOV EBX,单指令
 CALL 串换单  返回AL为
 JB +3
 STOSB
 STC
 RET
 MOV EBX,单扩指令
 CALL 串换单  返回AL为
 JB +4
 MOV AL,66
 STOSW
 STC
 RET
 CLC
 RET 


写多指令
 PUSHAD
 MOV EDI,多指令
柜循环
 MOVSX EDX,WO [EDI]  起码应该是有一个柜的.
 TEST EDX,EDX
 JZ 无多指令   是否为0.
 MOV EAX,[EDI+码集型]
 SUB EDX,EDX
 MOV DL,AH
 AND DL,F   这是班次员数
 MOV [EBP+领班次],EDX
 MOV [EBP+领员数],EDX
 MOV DL,AH
 SHR DL,4  这是码名长度.只对1号3号类型有效.
 MOV [EBP+码名长],EDX
 MOV [EBP+领码集型],AX
 MOV [EBP+又领码集型],AX
 PUSHAD
 LEA EDI,[EDI+码名集]   注意,此处码名集为单字节!
 SUB EBX,EBX  这是码序
 CALL 匣中找码  在码匣中
 JZ 找到码了
 POPAD
 MOVSX EDX,WO [EDI]  起码应该是有一个柜的.
 ADD EDI,EDX
 JMP 柜循环  是否为0.
无多指令  柜大败
 POPAD
 CLC  未知串  
 RET 

找到码了
 MOV CL,[EBP+领码集型] 只使用了低3位.
 AND CL,7
 SHL EBX,CL
 MOV [EBP+领码序],EBX   真正的位置.
 MOV [EBP+又领码序],EDX  有时被作为叮
 POPAD
    从这里或下面开始,进行invoke指令.函式呼叫,呼用,唤起
 ADD ESI,ECX
 PUSHAD   班中成员到齐
 MOV EDI,[EBP+缓数值址]  每个班员
 CALL 取RM每班    现在的ESI和原来的ESI我也没怎么考虑.
 MOV [EBP+文正],ESI
 POPAD
 JB 无多指令  未知串
 CALL 匣中处理
 JNB 无多指令
 POP EBX
 PUSH EDI
 POPAD
 MOV ESI,[EBP+文正]
 STC
 RET  写壤成功.

呼函指令
 ADD ESI,ECX
 SUB EAX,EAX
 MOV [EBP+领码集型],EAX
 MOV [EBP+领码序],EAX  
 MOV [EBP+又领码序],EAX  有时被作为叮
 MDMOV [EBP+原缓数值址],[EBP+缓数值址]

 MDMOV [EBP+领班次],[EBP+限取班次]  空间限制的数量.
 MOV EDI,[EBP+缓数值址]
 CALL 取RM每班     领班次被倒减
 MOV EBX,[EBP+缓数值址]
 MOV AL,[EBX+签性]
 MOV AH,AL
 AND AL,DF   除去位5的20代.
 CMP AL,50  将无址立即数加址.
 JNZ +2
 OR AH,80
 MOV [EBX+签性],AH

 MOV [EBP+文正],ESI
 MOV EBX,EDI  缓所到达的位置
 MDSUBR [EBP+领班次],[EBP+限取班次]    回正值
 MDCMP [EBP+领班次],[EBP+可用班次]   可靠性的数量
 JAE 呼函败  大错误, 太多了.不可靠. 消行回
 MOV BY [EBP+领员数],1
 SUB EBX,签枕值
 MOV [EBP+缓数值址],EBX
 DEC DW [EBP+领班次]
 JS 呼函败  负数,大错.消行回
 JZ CALL参数  只取到一个参数时

PUSH参数环
 MOV EDI,PUSH柜
 CALL 匣中处理
 JNB 呼函败
 SUB DW [EBP+缓数值址],签枕值
 POP ECX
 PUSH EDI   新的生产进度
 DEC DW [EBP+领班次]
 JNZ PUSH参数环
CALL参数
 MOV EDI,CALL柜
 CALL 匣中处理
 JNB 呼函败
 MDMOV [EBP+缓数值址],[EBP+原缓数值址]
 POP EBX
 PUSH EDI
 POPAD
 MOV ESI,[EBP+文正]  新地进度成功.
 STC
 RET  写壤成功.
呼函败
 MDMOV [EBP+缓数值址],[EBP+原缓数值址]
 POPAD
 MOV EDI,[EBP+原产正]
 JMP DW 消行回



 INCLUDE 匣柜处理GS02.TXT     形象地说:从装有数据的匣柜中取出数据

 INCLUDE 后期检查GS02.TXT     生成程序后,写入用户预定义的一些值

 INCLUDE 装配代码GS02.TXT    装配方面的子程序

 INCLUDE 终汇编名称数据等GS02.TXT    


⌨️ 快捷键说明

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