FASM编写8位整数转二进制/十六进制程序异常,求修复
修复Flat Assembler整数转二进制/十六进制程序
原代码存在的问题
- 二进制转换的核心逻辑未实现(输出0/1、左移操作、计数递增)
- 十六进制转换缺少隔离低4位的
and 15位运算 PrintHexDigit中使用jp(奇偶跳转)判断数值是否大于9,逻辑错误- 导入表中
kerne132拼写错误,应为kernel32 - 缺少示例要求的开头提示文本
- 输出格式未对齐示例(如
Binary:和Hex:后的空格、换行) - 十六进制转换逻辑冗余,重复加载原数据
修复后的完整代码
format PE console include 'win32ax.inc' section '.code' code readable executable start: ; 输出开头提示文本 cinvoke printf, "This x86 assembly program converts an integer to binary and hex.%c%c", 10, 10 cinvoke printf, "Enter an integer from 0 - 255: " cinvoke scanf, "%d", Num ; 验证输入范围(0-255) mov eax, [Num] cmp eax, 0 jl start cmp eax, 255 jg start call BinConvert call HexConvert cinvoke printf, "%c%c", 10, 10 jmp start ; 二进制转换子程序 BinConvert: cinvoke printf, "Binary: " mov [Count], 0 mov eax, [Num] mov [Temp], eax BinLoop: mov eax, [Temp] and eax, 128 ; 检查最高位(第7位) jnz PrintOne ; 输出0 cinvoke printf, "0" jmp BinNext PrintOne: cinvoke printf, "1" BinNext: shl dword [Temp], 1 ; 左移1位,处理下一位 inc dword [Count] cmp dword [Count], 8 jl BinLoop cinvoke printf, "%c", 10 ret ; 十六进制转换子程序 HexConvert: cinvoke printf, "Hex: " mov eax, [Num] mov [Temp], eax shr dword [Temp], 4 ; 右移4位,取高4位 call PrintHexDigit mov eax, [Num] mov [Temp], eax and dword [Temp], 15 ; 隔离低4位 call PrintHexDigit cinvoke printf, "%c", 10 ret ; 打印单个十六进制数字 PrintHexDigit: mov eax, [Temp] cmp eax, 9 jg PrintLetter ; 数字0-9 cinvoke printf, "%d", eax ret PrintLetter: ; 字母A-F(ASCII 65-70),数值+55 add eax, 55 cinvoke printf, "%c", eax ret section '.data' data readable writeable Num dd 0 Temp dd 0 Count dd 0 section '.idata' import data readable library msvcrt,'msvcrt.dll', kernel32,'kernel32.dll' import msvcrt, printf,'printf', scanf,'scanf' import kernel32, ExitProcess,'ExitProcess'
关键修复说明
二进制转换补全:
- 通过
and eax,128检测最高位,非零则输出'1',否则输出'0' - 使用
shl dword [Temp],1左移数据,依次处理每一位 - 用
Count变量计数,确保输出完整8位
- 通过
十六进制逻辑修正:
- 高4位通过
shr dword [Temp],4获取,低4位通过and dword [Temp],15隔离 - 修正
PrintHexDigit的判断逻辑,用jg替代错误的jp,正确区分数字和字母
- 高4位通过
格式与细节修复:
- 添加开头提示文本,匹配示例输出
- 调整
Binary:和Hex:后的空格,保证输出对齐 - 修正导入表中
kernel32的拼写错误 - 增加输入范围验证,确保输入在0-255之间
内容的提问来源于stack exchange,提问作者lucid Dream
相关产品推荐
相关产品推荐

