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

📄

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

后断符6种
 XCHG EAX,EDX
 CALL 前断符6种
 XCHG EAX,EDX
 RET

  在这里增加数引连续吧??  冒号连续呢?

取串
英界符取串  当前行无串为JB,有则:SI为串首,CX为长.AL前符,DL尾符.
     本程序设计为16位/32/64位通用.但16位下只处理64K以下数据.
 MOV CL,5  如果串前的符号个数太多不取  三种形式的无串?
英界串环 小于不等:文尾. 小于等:`. 大于等于:"'. 大于不等:有串!
 PUSH ESI  此处SI即串首或即引号.
 CALL 读一字节  大于等于为:引号串!
 JB 无英界串  停串文尾
 CMP AL,22 "
 JZ 引号串
 CMP AL,27 '
 JZ 引号串
 CMP AL,D
 JZ 无英界串  借出 JZ 失败
 CMP AL,A
 JZ 无英界串  借出 JZ 失败
 CMP AL,'`'
 JZ 无英界串    软失败 废行型
 CALL 英界符检查
 JAE 普通串  取到了一个普通串首.
 DEC CL  串前符个数限定.
 JZ 无英界串  软失败 废行型
 POP EAX    重新开始记忆串首.
 JMP 英界串环

无英界串
 POP ESI
 STC   其中,JB且不等是文尾. JB且JZ:普通无串.
 RET  要注意:AL是无法得串时处的界符了, SI:指正是该符.

普通串
 CALL 读一字节  有效的非界符数据不能在文最尾.
 JB +2  文尾时,串尾符可能就是串本身最后一个字节.??有效吗?
 CALL 英界符检查
 JAE -2  注意返回的SI为:串尾+2,即串尾后的第二个可能的界符.
 MOV DL,AL  或XCHG AX,DX.  串后符
 XCHG ECX,ESI
 POP ESI   在我的V1文章中,另一方式也一样.
 DEC ECX   使CX=串尾+1,即串尾后的第一个界符.
 CALL 测减读1字节   串前符为AL.
 MOV DH,AL
 SUB ECX,ESI   一定为JA,即NZ且NC.
 RET 正好: 大且不等有正常串.

引号串
 MOV DL,AL
 CALL 读一字节
 JB 无英界串  引号串败
 CMP AL,DL
 JNZ -2
 MOV ECX,ESI  些时,SI为另一个引号后的值.
 CALL 读一字节 再此时,SI可能更后了,不用了!!
 MOV DL,AL  串后符.
 POP ESI  最早早就压入的SI是正指向前引号的.
 CALL 测减读1字节  取出串前符到AL.
 MOV DH,AL
 INC ESI   串首址
 DEC ECX
 SUB ECX,SI  计算串长
 JA +2
 STC  串长为零非法,错误的串长. 是否可以为合法的其它含义呢?
 RET
 CMP AL,AL  无借位,且相等为引号串.
 RET


英界符检查  它和检查并转换的标志相反
        结果 JB 成功,围内; JAE 或JNC 失败
        第一个数为首,第二个数为其后加1 3A:-40:@
 CMP AL,30   使用了AL,BX,CX!隐含注意ES!!
 JB 界符检查回  是界符 有借位
 CMP AL,A0   注意,普通汉字是从汉字空格A1A0(或A1A1)开始的
 JA 界符检查回  不是界符, 这里,类汉字全部作不是界符.
   JB为是, JAE/NB为不是
 PUSH EDI  要压栈DI的为好.
 MOV EDI,英界符  GBK汉字8140-FEFE/FEFF.注意内存按1,2字节放着!
 JMP 判内围

16制界检查
 PUSH EDI
 MOV EDI,16制界符 
判内围
 PUSH ECX
 MOVZX ECX,BY [DI]  循环次数.
 INC EDI
界符继续查
 SCASB 可相等,也为围外(目前不用).
 JB 界符围外  不是界符 ;改为无借位
 SCASB 围内不可相等. +1的!
 JB 界符围内 是界符 有借位
 LOOP 界符继续查  (一般若为JB 则不可转化)
界符围外
 CLC  围外标志. 清借位
界符围内
 POP ECX
 POP EDI
界符检查回
 RET

 CLC   JNB为失败
 RET
判16制偶串
 TEST CL,1
 JNZ -2 
判16制串   检查串中是否全是16制方式的.
 PUSHAD
 LODSB
 CALL 16制界检查  JB为成功,JAE为失败.
 JAE +1
 LOOP -2
 POPAD
 RET

判再取16制数
 ADD ESI,ECX
 CALL 取串
 JB -2
判得16制数
 CALL 判16制串  
 JNB +3 不能取得16制   此串失去  不认识,
 CALL 倒取16制数   取成后,已是串后.
 CLC
 RET
 ADD ESI,ECX    已是串后
 STC   判取16制败
 RET

    关于16制串处理的大量程序.

倒取16制数   此为一般正式可视数据. 倒取原始数据并且限定8字节.
   原数址ESI,原数长ECX,移后,ESI为串后址,ECX为有效新长度.
 PUSH EDI    EDI不变
 PUSH EDX        前面可以有叮的.
 MOV EDX,[EBP+标准数值长]  8字节标准数据长度.
 ADD ESI,ECX   例串:2-5,长度4,尾指6.
 PUSH ESI   此处ESI已为串后址 ? 要注意
 STD   倒移,相当于减1了.  
 LODSB  串后前移至正好最后一个字节. 也即 DEC ESI
 PUSH ECX
 SHR ECX,1  取偶整.
 JZ 倒半16制  只有1位半16制.
  标准的倒移换16制程序 {
 CMP ECX,EDX
 JBE +1
 MOV ECX,EDX   超过8字节也只取8字节.
 STD  倒移
 CALL 倒译16制  先取是低半位,再高半位,合并的.
 CLD  正向写入.
 STOSB
 LOOP -3  }   
倒半16制
 POP ECX
 MOV EDX,[EBP+标准数值长] 
 PUSH ECX
 SHR ECX,1
 JNB +5
 CMP ECX,EDX
 JAE +3
 CALL 半16制
 CLD  正向写入.
 STOSB 
 POP ECX
 INC ECX
 SHR ECX,1  换成了新的长度. 
 CMP ECX,EDX
 JBE +1
 MOV ECX,EDX
 POP ESI
 JMP 高处置零  ECX长度比8差的哪一部分清零.

引号取数   前面可以有叮的?  标准长数据是8字节64位的.
   移后,ESI为串后址,ECX为有效新长度. EDI不受影响.
 PUSH EDI
 PUSH EDX  这里也是引号取数
 PUSH ESI
 PUSH ECX
 MOV EDX,[EBP+标准数值长]  为8字节.
 CMP ECX,EDX
 JB +1
 MOV ECX,EDX  只取长度小于等于8的有效字节.
 REP
 MOVSB
 POP ECX
 POP ESI
 ADD ESI,ECX   ESI要放在串尾部.
 INC ESI  走过其后的引号.
高处置零  标准的长度未到的检查并清零程序.标志自动CF=0
 CMP ECX,EDX  长度未到的清零.
 JAE +6   长度已过则不用清零了.
 XCHG ECX,EDX   清零需要原小长度后剩下的值.
 SUB ECX,EDX    EDX成为原小长度.
 SUB AL,AL
 REP
 STOSB
 MOV ECX,EDX  保持着数据的有效长度. 8或者比8小.
 POP EDX
 POP EDI
 JMP 缓址数成  已经取到了数据值.并且还有长度标志. 等且无借.


       与RM和叮类有关的取串子程序.
缓址数败
 MOV AH,0  不等,且没有借进位.
 SAHF
 RET

RM符串取数  取到直接数据和断句都算取完.即JA回.
 CALL RM查符     只有有不认识的串时才为:JNB
 JB -1
        EDI为写入点且不受影响. BX为返回叮标志情况.
   如果成功取到数,则ESI为串后址,ECX为有效新长度.
RM取串
 CALL 取串
 JB -3
取引数值    将引号数或16制数入缓.失败为JB.带嘱BH.
 JZ 引号取数  自动CF=0成功   标准长数据 EDI不变,ESI已串尾.
 CALL 判16制串  界检查为相反,JB成功,JNB非16制串.
 JNB 缓址数败    未知串, 置不等且无借.
 CALL 倒取16制数
 CMP DH,'-'
 JNZ 缓址数成
 求反呢? 大概是这个意思吧.NEG方式不行!它以0的方式影响着CF位.
 PUSHAD   ESI不受影响,已为串尾
 MOV ESI,EDI
 MOV ECX,[EBP+标准数值长]
 MOV AL,0
 SBB AL,[DI]
 STOSB
 LOOP -2
 POPAD    EDI不受影响
缓址数成
 CALL 长度标志   也叫嘱
 OR BL,40     置BL的位6有I标志.
 CMP AL,AL  成功的标志:等且无进借位.
 RET


 AND BH,BE   1字节标导.
 RET     如果叮已经存在,将不进行标志.
长度标志  如果有址的话,也不要?  如果叮后紧[符? 
 TEST BH,80   位8,叮存在的标志.
 JNZ -1  已经存在叮.
 CMP CL,2
 JB -4 出   1字节
 CMP CL,3
 JB +6  2字节
 CMP CL,5
 JB +2
 OR BH,41
 RET 
 OR BH,40
 RET
 OR BH,1
 RET





    注意,DL被作了缓冲用数. 但在写值时,整个EDX都被压栈了.
直译16制   必须是偶数个的,16制文本顺序的数据.合成1字节.无叮!
 CALL 半16制
 SHL AL,4  第一次取的是一字节中高的4位的.
 MOV DL,AL   AH不许动???
 CALL 半16制
 ADD AL,DL   第二次取的是低的4位的.
 RET

倒译16制  STD的!!方向减1.1字节,将被用于组装可带叮16制数目的.
 CALL 半16制
 MOV DL,AL   第一次取的是一字节中低的4位的.
 CALL 半16制
 SHL AL,4  第二次取得是高4位.
 ADD AL,DL   
 RET

半16制   取得半个16制的值到AL上.
 LODSB
 SUB AL,30
 CMP AL,A
 JB +1
 SUB AL,7
 RET




⌨️ 快捷键说明

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