|
- .版本 2
- .支持库 spec
- .程序集 程序集1
- .子程序 _启动子程序, 整数型, , 请在本子程序中放置易模块初始化代码
- _临时子程序 () ' 在初始化代码执行完毕后调用测试代码
- 返回 (0) ' 可以根据您的需要返回任意数值
- .子程序 _临时子程序
- .局部变量 字节集, 字节集
- .局部变量 十六进制文本, 文本型
- .局部变量 字节集2, 字节集
- 字节集 = 到字节集 (“Hello World! 中文测试”)
- 十六进制文本 = 取空白文本 (左移 (取字节集长度 (字节集), 1))
- 置入代码_字节集到十六进制文本 (字节集, 十六进制文本, 真)
- 调试输出 (“十六进制文本”, 十六进制文本)
- 字节集2 = 取空白字节集 (右移 (取文本长度 (十六进制文本), 1))
- 置入代码_十六进制文本到字节集 (十六进制文本, 字节集2)
- 调试输出 (“转换后”, 到文本 (字节集2))
- ' 本名称子程序用作测试程序用,仅在开发及调试环境中有效,编译发布程序前将被系统自动清空,请将所有用作测试的临时代码放在本子程序中。 ***注意不要修改本子程序的名称、参数及返回值类型。
- .子程序 置入代码_字节集到十六进制文本, , 公开,
- .参数 字节集, 字节集
- .参数 结果文本, 文本型, 参考, 调用前结果文本必须进行 取空白文本(左移(取字节集长度(字节集),1))
- .参数 大写, 逻辑型, , 是否以大写结果输出
- 置入代码 ({ 139, 69, 8, 138, 93, 16, 128, 227, 1, 139, 16, 139, 66, 4, 131, 194, 8, 185, 0, 0, 0, 0, 235, 11, 80, 138, 4, 17, 232, 10, 0, 0, 0, 88, 65, 59, 200, 114, 241, 201, 194, 12, 0, 80, 81, 82, 81, 209, 225, 139, 209, 89, 139, 77, 12, 139, 9, 138, 224, 192, 232, 4, 232, 18, 0, 0, 0, 136, 4, 10, 138, 196, 232, 8, 0, 0, 0, 136, 68, 10, 1, 90, 89, 88, 195, 36, 15, 60, 0, 114, 8, 60, 9, 119, 4, 4, 48, 235, 11, 128, 251, 1, 117, 4, 4, 55, 235, 2, 4, 87, 195 })
- ' mov eax,[ebp+8] ;字节集地址
- ' mov bl,[ebp+16] ;大小写 1大写0小写
- ' and bl,1
- ' mov edx,[eax] ;字节集数据地址
- ' mov eax,[edx+4] ;字节集长度
- ' add edx,8 ;字节集数据地址+8
- ' mov ecx,0 ;字节集指针计数
- ' .while ecx < eax
- ' push eax
- ' mov al,[edx+ecx] ;字节集值 送AL寄存器
- ' CALL WRITE_TEXT
- ' pop eax
- ' inc ecx
- ' .endw
- ' leave
- ' retn 12
- ' WRITE_TEXT: ;写文本 ECX 地址 AL值
- ' push eax
- ' push ecx
- ' push edx
- ' push ecx ; 高位地址 EDX=ECX*2 低位=高位+1
- ' shl ecx,1
- ' mov edx,ecx
- ' pop ecx
- ' mov ecx,[ebp+12] ;文本地址
- ' mov ecx,[ecx] ;文本数据地址
- ' mov ah,al
- ' shr al,4
- ' CALL DEC2HEX
- ' mov [ecx+edx],al ;写高位
- ' mov al,ah
- ' CALL DEC2HEX
- ' mov [ecx+edx+1],al ;写低位
- ' pop edx
- ' pop ecx
- ' pop eax
- ' ret
- ' DEC2HEX: ;十进制整数(0~15)转十六进制Ascii (AL进出)
- ' AND AL,0FH ;处理低8位
- ' .if Al >=0 && Al <=9 ;数字
- ' ADD AL,30H
- ' .else
- ' .if BL == 1
- ' ADD AL,37H ;大写+37H
- ' .elseif
- ' ADD AL,57H ;小写+57H
- ' .endif
- ' .endif
- ' ret
- .子程序 置入代码_十六进制文本到字节集, , 公开
- .参数 输入文本, 文本型, , 不区分大小写,不得为奇数字节,非十六进制字符视为0处理
- .参数 结果字节集, 字节集, 参考, 调用前结果字节集必须进行 取空白字节集(右移(取文本长度(输入文本),1))
- 置入代码 ({ 139, 85, 8, 139, 18, 139, 77, 12, 139, 9, 131, 193, 8, 102, 139, 2, 102, 11, 192, 117, 2, 235, 15, 134, 224, 232, 10, 0, 0, 0, 136, 25, 131, 194, 2, 65, 235, 231, 201, 195, 102, 82, 138, 212, 232, 17, 0, 0, 0, 138, 218, 192, 227, 4, 138, 208, 232, 5, 0, 0, 0, 10, 218, 102, 90, 195, 128, 250, 48, 114, 10, 128, 250, 57, 119, 5, 128, 234, 48, 235, 32, 128, 250, 65, 114, 10, 128, 250, 70, 119, 5, 128, 234, 55, 235, 17, 128, 250, 97, 114, 10, 128, 250, 102, 119, 5, 128, 234, 87, 235, 2, 178, 0, 195 })
- ' mov edx,[ebp+8] ;文本地址
- ' mov edx,[edx] ;文本数据地址
- ' mov ecx,[ebp+12] ;字节集地址
- ' mov ecx,[ecx] ;字节集数据地址
- ' add ecx,8 ;数据地址+8
- ' START:
- ' mov ax,[edx] ;读文本2字节到AX寄存器
- ' .if ax == 0 ;读到空字符
- ' JMP ASM_END ;结束转换
- ' .endif
- ' xchg ah,al ;AH与AL交换 (AX高低字节交换)
- ' CALL BYTE_HEX2DEC ;调用十六进制字符串转10进制
- ' mov [ecx],bl ;将转换结果写入字节集
- ' add edx,2 ;文本数据地址+2
- ' inc ecx ;字节集数据地址+1
- ' JMP START
- ' ASM_END:
- ' leave
- ' retn 8
- ' BYTE_HEX2DEC: ;将2个16进制字符串转为10进制 AX进 BL出(0~255)
- ' push dx
- ' mov dl,ah ;处理高位
- ' call HEX2DEC
- ' mov bl,dl
- ' shl bl,4 ;左移4位
- ' mov dl,al ;处理低位
- ' call HEX2DEC
- ' or bl,dl
- ' pop dx
- ' ret
- ' HEX2DEC: ;将1个16进制字符串转换为10进制 DL进DL出(0~15)
- ' .if dl >= 48 && dl <= 57 ;数字
- ' sub dl,48
- ' .elseif dl >= 65 && dl <=70 ;大写字母
- ' sub dl,55
- ' .elseif dl >= 97 && dl <=102 ;小写字母
- ' sub dl,87
- ' .else ;非法字符
- ' mov dl,0
- ' .endif
- ' ret
复制代码
|
|