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

📄

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



匣中处理
    进行invoke指令.函式呼叫,呼用,唤起
 MOVSX EAX,WO [EDI+码匣距] 
每个匣
 MOVZX ECX,BY [EBP+领员数]
 MOV EBX,[EBP+缓数值址]
 ADD EDI,EAX   EDI作为每个匣的匣首. ESI作为其内部.
 LEA ESI,[EDI+1]  跳过小距,即RM匣距
每个员适
 MOV EAX,[EBX+签性]
 CALL [ESI]
 JNZ 继匣
 LODSD
 LEA EBX,[EBX+缓枕]
 LOOP 每个员适

 DEC ESI
 LODSW   将RM檩放到AH中
 POP ECX   call进来压的EIP
 POP EDI   如果整个失败,好象还可重写似的.
 PUSH EDI    真正的壤EDI
 PUSH ECX 
 CALL RM入壤  这里进入了入壤阶段了. 入壤时,是否有檩??
 STC
 RET  写壤成功后,也是一个码中的一切都结束了.

继匣
 MOVZX EAX,BY [EDI]
 TEST EAX,EAX
 JNZ 每个匣
 CLC  柜大败,未知串.
 RET 



RM入壤   此时EBX为缓X? EDI匣首,ESI匣内.
 TEST AH,1
 JNZ 加长指令入壤
 MOV EBX,[EBP+缓数值址]
 LEA EDX,[EBX+缓RM帜]  为缓RM咛 + 缓枕  或者加两次也可以
 MOV ECX,[EDX]  取出成员第一个为CX和第二个为DX.
 MOV EDX,[EDX+签枕]
 TEST AH,80   是否先写66.  数据前缀是跟随第一个还是共同.
 CALL RM数据前缀
 TEST AH,40  是否有前缀0F.
 JZ +2
 MOV AL,F
 STOSB
 TEST AH,20    是否先写一个到壤中.
 JZ +1
 MOVSB    所有在匣中的值必须全部取完.
 LODSB     然后,将ESI变成了缓.
   X   OR AL,[EBP+领码序]  好象不能提前写领码序.
 PUSH [ESI]
 MOV ESI,EBX   缓放入ESI中.
 MOV EBX,ECX  总叮 一般是RM1的叮.
 RET  或 JMP EAX  各个子程序天地了.

   檩中数据.10位4前缀随1/2. 20位5是否先写1字节.
         40位6是否当前指令码强行四字节.

加长指令入壤   1/2前加,4后加. 8W叮.80写序 10RM1,20RM2.
 LODSB
 XCHG EAX,EDX
 MOV DH,[EBP+领码序]
 MOV AH,[EBP+又领码序] 咛
 TEST DL,1
 JZ +1
 MOVSB

 TEST DL,2
 JZ +1
 MOVSB

 TEST DL,8
 JZ +8
 CMP AH,1  咛
 JNZ +2
 MOV AL,66
 STOSB
 LODSB
 JB +1
 OR AL,1
 STOSB

 TEST DL,80
 JZ +1
 OR [EDI-1],DH  原序.

 MOV ECX,[EBP+缓数值址]
 TEST DL,10
 JNZ +3
 TEST DL,20
 JZ 加长尾字节
 LEA ECX,[ECX+签枕]
 LODSB
 PUSH EDX
 PUSH ESI
 MOV ESI,ECX
 MOV EBX,[ESI+签性]
 PUSH EBX
 CALL RM型
 POP [ESI+签性]
 POP ESI
 POP EDX

加长尾字节
 TEST DL,4
 JZ +1
 MOVSB
 CMP BY [ESI],0
 JNZ 加长指令入壤
 RET 

RM数据前缀 
 JZ 共同定叮    是0则转向共同的
 TEST CH,80    跟随第一个的.
 JNZ 写RM数据前缀  
 TEST CH,1
 JZ +5
 TEST AH,10
 JZ +3   是否强行为4字节. 主要用于J类的非单字节偏移.
 AND CH,FE   PUSH的如果是默认双字节I,也在此改为四字节.
 OR CH,40   其它的RETN,ENTER,等,目前不计.判s!!! ??
 MOV [EBX+签咛],CH
 RET
共同定叮
 TEST CH,80
 JZ 第二个叮 如果第一个无叮,转第二个
 CMP BY [SI],80   只有WRM_sI型,第二个不被第一个改.
 JZ 写RM数据前缀
 MOV AL,CH
 AND AL,41
 AND DH,BE   第一叮有,将第二个改为第一个叮.
 OR DH,AL
 ADD EBX,签枕
 MOV [EBX+签咛],DH
 SUB EBX,签枕
 JMP 写RM数据前缀
第二个叮
 MOV AL,DH
 AND AL,41  不管第二个有无叮,都将第一个改为第二个叮.
 AND CH,BE
 OR CH,AL
 MOV [EBX+签咛],CH
写RM数据前缀
 TEST CH,1   00,01,40,41. 有叮就简单的,位6=1就当WO了.
 JZ +2    不是WO情况,不写数据前缀.
 MOV AL,66
 STOSB   实际上只有带叮的和由第二个决定的,WO型才加上了66!!
 RET



     这里可以进行加强型处理.

环RM每班
 BTR EBX,10  断句标志
 JB 班次错 错误.  次数未满发生断句,错误.
 BTR EBX,12  断词标志
 JNB 班次错    必须有逗号来断词.

取RM每班 
 MOV EBX,10    什么也没有的意思.
 TEST BY [EBP+领码集型],80
 JZ +1
 OR BL,80   位7有址.

 CALL 缓取RM员  进入取一次RM员
 JB 班次错
 TEST BL,10  位4反有R
 JZ +2  有R
 TEST BL,40   位6I
 JZ 班次错  错误,没有实际数据
 MOV [EDI+缓RM帜],EBX   数据全部入EDI
 LEA EDI,[EDI+缓枕]

 TEST BL,20  是否有代号型串
 JZ +1
 ADD ESI,ECX  代号的进
 BT EBX,12
 JB +1   已经有断词
 CALL RM查符   目前,并没有检查多余的班次.
 DEC DW [EBP+领班次]  一个班中一般有1-3个由逗号分开的RM成员
 JNZ 环RM每班 RM班次循环
 CLC
 RET  正确性取完数据
班次错
 STC
 RET




RM查符    检查断句符,址符等的情况.
 PUSH ESI
 MOV CL,5
RM查符环
 CALL 读一字节
 JB RM断句
 CMP AL,D
 JZ RM断句
 CMP AL,A
 JZ RM断句
 CMP AL,'`'
 JZ RM断句
 CMP AL,","
 JZ RM断词  返回
 CMP AL,'['
 JNZ +2   置址标志
 OR BL,80
 JMP 继RM查符
 CMP AL,']'
 JNZ +2
 BTS EBX,11  位10是断句标志, 位11是后址符]的标志.
 JMP 继RM查符     位12是断词标志.
 CMP AL,"'"
 JZ 无逗号
 CMP AL,'"'
 JZ 无逗号
 CALL 英界符检查
 JNB 无逗号  已经不再是符号时
继RM查符
 DEC CL
 JNZ RM查符环
 JMP RM断句
无逗号   在下一个串之前是否发生逗号.
 BTR EBX,11   测试后址符标志,并且清.
 JNB 还可取  没有[符, 只有这里可以: 词语内后继取串
RM断句
 BTS EBX,10
 STC 断句
还可取
 POP ESI
 RET
RM断词   内部断词  外部断词.
 POP EAX   ESI继续
 BTS EBX,12
 STC  词内不可再取.
 RET





匣中找码   下面为各种码集型,不等为无,相等则为有.
 TEST AL,10   单一码
 JZ +4
 CMP ECX,EDX
 JNZ +1  柜败回
 REP:CMPSB
 RET 
 TEST AL,20   叶集码
 JZ +2
 CALL 交串集串
 RET
 TEST AL,40  补叶集码
 JZ 两补叶
 TEST DL,DL
 JZ 外补叶
 SUB ECX,EDX  要起码要比补前名称长
 JA +3  必须大  
此柜败
 MOV AH,1
 SAHF  柜失败,不等回 
 RET
 XCHG ECX,EDX  剩下的长度入EBX中.
 REP:CMPSB   原来的长度在EAX中.
 JNZ 此柜败
 MOV ECX,EDX  剩下长度
外补叶
 MOV EDI,[EDI]   串叶位置
 CALL 交串集串
 RET
两补叶
 TEST AL,80
 JZ 此柜败
 SUB ECX,2
 JBE 此柜败
 LODSW
 PUSH EDI
 PUSH ECX
 MOV EDI,[EDI]   双顺M   加长叮
 MOVZX ECX,[EDI]
 INC EDI
 REPNZ:SCASW
 MOV EDX,ECX
 POP ECX
 POP EDI
 JNZ 此柜败
 PUSH EDX  首叮序EDX和第二次序EBX.
 SCASD   首叮的址去掉.
 CALL 外补叶
 POP EDX
 RET




常用叮
 PUSH EBX
 MOV EBX,叮杆址
 CALL 串换单
 POP EBX
 JB +3
 AND BH,3E     让位760=0
 OR BH,AH
 CLC   成. 并且写入BH中了.
 RET 

常用REG   将REG转化到AL .   
 PUSH EDI
 PUSH EBX
 PUSH EDX
 MOV EDI,REG叶址
 CALL 交串集串
 JB +1
 MOV EAX,EBX
 POP EDX
 POP EBX
 POP EDI
 RET 




串换单     EBX为杆址
 PUSH EDI
 PUSH ESI
 PUSH EAX
 MOV EDI,ESI   EDI为源.
 MOV ESI,EBX  ESI为杆.
串换单环
 LODSW
 CMP AL,CL
 JNZ 串单环增  
 PUSHAD
 REPZ
 CMPSB
 POPAD
 JZ 串单成    成功RET返回
串单环增
 CBW
 CWDE 
 ADD ESI,EAX 
 CMP AL,0
 JNZ 串换单环  继续
 POP EAX
 POP ESI
 POP EDI
 STC    串单循环失败
 RET

串单成
 MOV AL,AH
 POP ESI
 POP ESI
 ADD ESI,ECX
 POP EDI
 CLC
 RET




留符注册签
 PUSH EDX:PUSH EBX   EDX中留着前后符.
 CALL 注册签
 POP EBX:POP EDX
 RET


注册函定签
 PUSHAD
 MOV AH,12   行号性质的定签
 CALL 注册签
 POPAD
 RET


注册签
 MOV EBX,[EBP+册尾]
 MOV [EBX+签性],DW 0
 MOV [EBX+签咛],AH   AL中暂时存放着前符.
 MOV [EBX+签壤],EDI
 MOV [EBX+签址],ESI
 MOV [EBX+签长],ECX
 MOV [EBX+签符],EDX   DL后符,DH前符.
 TEST AH,38
 JZ 不写签数的签
 MOV EDX,EDI  原壤
 TEST AH,20  用签
 JZ +1
 CALL 数值入壤    虚拟写壤,ESI的假数据. 即ESI不变
 TEST AH,18    检查行偏10或行差8
 JZ +1
 MOV EDX,EDI   用行的定签,没有经过入壤,在此仍不变.
 ADD EDX,[EBP+段差]    计算真壤,  用行签为偏后的.
 MOV [EBX+签数],EDX
不写签数的签     如赋值签类,事先已写好签数.
 LEA EBX,[EBX+签枕]
 MOV [EBP+册尾],EBX
 CMP EBX,[EBP+册界]
 JA DW 异常退出
 ADD ESI,ECX
 STC
 RET




无址取R
 CALL 常用REG   叮在AL的高位的方式.
 JB 无址代I
 AND BL,EF  置有R标记  0表示有,1表示无.
 MOV AH,AL
 AND AH,7
 OR BL,AH  REG合成到BL中去.
 OR BH,80  如果无址则置有叮 6ZF,0CF:00=1,01=2,10=4
 CMP AL,8
 JB +4
 OR BL,8  有W位.
 CMP AL,10
 JAE +3
 OR BH,1   OR和AND类指定恒定无借位!
 CLC
 RET
 OR BH,40
 RET

缓取RM员
 MOV [EDI+1C],40404040   表示空的标志.
 CALL RM查符
 JB 败RM缓
 TEST BL,80
 JNZ 有址取RM
             如果无址的情况
 CALL RM取串
 JB 败RM缓
 JZ 成RM缓    取到立即数时,叮已入BH.
 CALL 取叮值
 JB 无址取R     没有取到叮
 OR BH,AL
 CALL RM查符
 JB 败RM缓
 TEST BL,80
 JNZ 有址取RM
 CALL RM取串
 JB 败RM缓
 JZ 成RM缓
无址代I
有址代I
 OR BL,60   置I代.
 OR BH,20  置用签 回
成RM缓
回RM缓
 MOV [EDI+签符],EDX
 MOV [EDI+签址],ESI
 MOV [EDI+签长],ECX
 CLC
 RET

败RM缓
 STC
 RET

环RM址   循环取
  CALL RM查符
  JB 回RM缓
有址取RM     如果有址
 CALL RM取AL串
 JZ 有址纯I   有点远
 JB 回RM缓
             取到叮值时
 CALL 简叮值
 JB 有址取R
 MOV CL,RM座叮
 CALL 入座
 JB 败RM址
 
 CALL RM查符
 JB 回RM缓
 CALL RM取AL串
 JB 败RM址
 JNZ 有址代I   同无址代I    75BA
纯I入座
 CALL 换叮值
 OR BL,40  置有I
 PUSH ECX
 MOV CL,RM座叮
 CALL 入座
 POP ECX   这一个叮入座不计失败
 JMP 成RM缓


败RM址
 STC
 RET
 

有址取R
 CALL 常用REG
 JB 有址代I      对于有址的R目前不严,都作32位.以后再说.
 AND AL,7  只取其低3位. 都当32位处理.
 AND BL,EF  置有R标记  0表示有,1表示无.
 OR BL,AL
 CMP DL,'*'
 JZ R2入座
 CMP DH,'*'
 JZ R2入座
 MOV CL,RM座R1
 CALL 入座
 JNB 环RM址   继续循环取.
R2入座
 MOV CL,RM座R2
 CALL 入座
 JB 败RM址
转环RM址
 JMP 环RM址   继续循环取.

 
有址纯I
 CMP DL,'*'
 JZ 有址的N
 CMP DH,'*'
 JZ 有址的N
 JMP 纯I入座


有址的N
 MOV EAX,[DI]
 CMP EAX,9
 JA 败RM址
 MOV CL,RM座N
 CALL 入座
 JNB 转环RM址   继续循环取.
 STC
 RET




RM取AL串
 PUSH EBX
 SUB EBX,EBX
 CALL RM取串
 MOV AL,BH
 POP EBX
 RET


简叮值
 PUSH EBX
 MOV EBX,简叮杆址
 CALL 串换单
 POP EBX
 RET 

取叮值   使用了串换单子程序, 将值取到了AL,AH中.
 PUSH EBX    CLC为成功.
 MOV EBX,叮杆址
 CALL 串换单
 POP EBX
 RET

换叮值
 PUSH EBX
 MOV EBX,换叮址
 XLAT
 POP EBX
 RET

入座    有借,小于不等为座满.
 MOVZX ECX,CL
 CMP [EDI+ECX],20
 JB +1     目前一般CF=1为失败.
 MOV [EDI+ECX],AL   无借 大于或等于为入座
 RET

 RM座R1=1C
 RM座R2=1D
 RM座叮=1E
 RM座N=1F

换叮址
 00014041

简叮杆址
 0200"BY"
 0201"WO"
 0202"DW"
 0203"QW"
 0000
 

⌨️ 快捷键说明

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