You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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'

关键修复说明

  1. 二进制转换补全:

    • 通过and eax,128检测最高位,非零则输出'1',否则输出'0'
    • 使用shl dword [Temp],1左移数据,依次处理每一位
    • 用Count变量计数,确保输出完整8位
  2. 十六进制逻辑修正:

    • 高4位通过shr dword [Temp],4获取,低4位通过and dword [Temp],15隔离
    • 修正PrintHexDigit的判断逻辑,用jg替代错误的jp,正确区分数字和字母
  3. 格式与细节修复:

    • 添加开头提示文本,匹配示例输出
    • 调整Binary:和Hex:后的空格,保证输出对齐
    • 修正导入表中kernel32的拼写错误
    • 增加输入范围验证,确保输入在0-255之间

内容的提问来源于stack exchange,提问作者lucid Dream

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 16:12:59