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

请求协助完成emu8086下十进制转IEEE754单精度汇编程序

EMU8086汇编程序:十进制转IEEE754单精度格式

程序需求

  • 功能目标:编写8086汇编程序,将指定格式的十进制数字转换为IEEE754单精度浮点格式
  • 输入要求:使用中断21h的0Ah功能读取输入,输入格式为±65535.999(例如+5589.014)
  • 输出要求:提供菜单让用户选择输出格式:
    • 二进制:分开显示符号位、指数位、尾数位
    • 十六进制:输出完整的32位十六进制表示
      输出需使用中断21h的02h功能实现
  • 验证要求:必须通过中断21h和10h功能对输入进行有效性验证,确保格式、数值范围符合要求

现有初始代码

.data
inputBuffer db 13 ; 最大长度:±65535.999 + 回车
db ? ; 实际读取的字符数(由0Ah功能返回)
db 13 dup(?) ; 存储用户输入内容

sign db 0 ; 0表示正数,1表示负数
integerPart dw 0 ; 数字的整数部分
decimalPart dw 0 ; 数字的小数部分,最多3位有效数字
menuOption db 0 ; 用户选择的菜单选项

promptMenu db "Selecciona una opcion:", 13, 10, "1. Binario", 13, 10, "2. Hexadecimal", 13, 10, "$"
promptInput db "Introduce el numero en formato +-65535.999: $"
errorMsg db "Entrada invalida, intenta nuevamente.", 13, 10, "$"  

maxValue dw 65535 ; 整数部分允许的最大值
maxDecimal dw 999 ; 小数部分允许的最大值

.code
start:
    mov ax, @data
    mov ds, ax

    ; 显示输入提示
    mov ah, 09h
    lea dx, promptInput
    int 21h

    ; 调用0Ah功能读取输入
    lea dx, inputBuffer
    mov ah, 0Ah
    int 21h

    ; 调用输入验证与处理函数
    call validateAndProcessInput

    ; 跳转至菜单显示
    jmp showMenu
    


proceedConversion:
    ; 此处添加根据选项执行转换的代码
    ; ...

finish:
    mov ah, 4Ch
    int 21h

showMenu:
    mov ah, 09h
    lea dx, promptMenu
    int 21h
    call getMenuOption
    ret

getMenuOption:
    mov ah, 01h ; 读取单个字符
    int 21h ; 读取的字符存于AL
    sub al, '0' ; ASCII转数值
    cmp al, 1
    jl invalidOption ; 小于1则无效
    cmp al, 2
    jg invalidOption ; 大于2则无效

    mov menuOption, al ; 保存选项
    jmp proceedConversion ; 进入转换流程

invalidOption:
    mov ah, 09h
    lea dx, errorMsg
    int 21h
    jmp showMenu ; 重新显示菜单

end start

关键补充实现

1. 输入验证与处理函数 validateAndProcessInput

完成输入格式检查、数值转换与范围验证,无效则提示错误并重新输入:

validateAndProcessInput:
    ; 初始化寄存器与变量
    mov si, offset inputBuffer + 2 ; 指向输入内容起始位置
    mov byte ptr [sign], 0
    mov word ptr [integerPart], 0
    mov word ptr [decimalPart], 0

    ; 检查符号位
    mov al, [si]
    cmp al, '+'
    je skipSign
    cmp al, '-'
    jne checkIntegerStart
    mov byte ptr [sign], 1
    inc si

skipSign:
    inc si

checkIntegerStart:
    ; 读取整数部分
    mov cx, 0
integerLoop:
    mov al, [si]
    cmp al, '.'
    je checkDecimalStart
    cmp al, 13
    je endInput
    ; 验证是否为数字
    cmp al, '0'
    jl invalidInput
    cmp al, '9'
    jg invalidInput
    ; 转换为数值累加
    sub al, '0'
    mov bx, [integerPart]
    mov ax, 10
    mul bx
    add ax, al
    ; 检查整数范围
    cmp ax, [maxValue]
    jg invalidInput
    mov [integerPart], ax
    inc si
    inc cx
    cmp cx, 5 ; 最多5位整数
    jle integerLoop
    jmp invalidInput

checkDecimalStart:
    inc si
    mov cx, 0
decimalLoop:
    mov al, [si]
    cmp al, 13
    je endInput
    ; 验证是否为数字
    cmp al, '0'
    jl invalidInput
    cmp al, '9'
    jg invalidInput
    ; 转换为数值累加
    sub al, '0'
    mov bx, [decimalPart]
    mov ax, 10
    mul bx
    add ax, al
    ; 检查小数范围
    cmp ax, [maxDecimal]
    jg invalidInput
    mov [decimalPart], ax
    inc si
    inc cx
    cmp cx, 3 ; 最多3位小数
    jle decimalLoop
    jmp invalidInput

endInput:
    ; 验证非空
    cmp word ptr [integerPart], 0
    jne validInput
    cmp word ptr [decimalPart], 0
    je invalidInput

validInput:
    ret

invalidInput:
    ; 错误处理并重新输入
    mov ah, 09h
    lea dx, errorMsg
    int 21h
    mov ah, 09h
    lea dx, promptInput
    int 21h
    lea dx, inputBuffer
    mov ah, 0Ah
    int 21h
    call validateAndProcessInput
    ret

2. 十进制转IEEE754单精度格式

IEEE754单精度为32位:符号位(1位)+指数(8位,偏移127)+尾数(23位,隐含最高位1),以下是核心转换框架:

; .data段新增变量
ieeeValue dd 0 ; 存储转换后的32位IEEE754值

; 转换函数:将integerPart+decimalPart转为IEEE754,结果存于eax
convertToIEEE754:
    ; 处理0的特殊情况
    cmp word ptr [integerPart], 0
    jne notZero
    cmp word ptr [decimalPart], 0
    je isZero

notZero:
    mov eax, 0
    ; 设置符号位
    mov bl, [sign]
    shl bl, 7
    mov ah, bl
    ; 归一化浮点数、计算指数与尾数(需根据实际逻辑完善)
    ; ...

isZero:
    mov eax, 0 ; 0的IEEE754表示为全0
    ret

3. 输出功能实现

二进制输出(分符号、指数、尾数)

outputBinary:
    mov eax, [ieeeValue]
    ; 输出符号位
    mov dl, 'S'
    mov ah, 02h
    int 21h
    mov dl, ':'
    int 21h
    mov dl, ' '
    int 21h
    mov dl, '0'
    test eax, 80000000h
    jz printSign0
    mov dl, '1'
printSign0:
    int 21h
    mov dl, 13
    int 21h
    mov dl, 10
    int 21h

    ; 输出指数位(8位)
    mov dl, 'E'
    int 21h
    mov dl, ':'
    int 21h
    mov dl, ' '
    int 21h
    mov cx, 8
    mov ebx, eax
    shr ebx, 23
    and ebx, 0FFh
printExponent:
    rcl ebx, 1
    mov dl, '0'
    adc dl, 0
    int 21h
    loop printExponent
    mov dl, 13
    int 21h
    mov dl, 10
    int 21h

    ; 输出尾数位(23位)
    mov dl, 'M'
    int 21h
    mov dl, ':'
    int 21h
    mov dl, ' '
    int 21h
    mov cx, 23
    mov ebx, eax
    and ebx, 07FFFFFh
printMantissa:
    rcl ebx, 1
    mov dl, '0'
    adc dl, 0
    int 21h
    loop printMantissa
    mov dl, 13
    int 21h
    mov dl, 10
    int 21h
    ret

十六进制输出

outputHex:
    mov eax, [ieeeValue]
    mov cx, 8
    mov ebx, eax
printHexLoop:
    rol ebx, 4
    mov dl, bl
    and dl, 0Fh
    cmp dl, 9
    jle hexDigit
    add dl, 7
hexDigit:
    add dl, '0'
    mov ah, 02h
    int 21h
    loop printHexLoop
    mov dl, 13
    int 21h
    mov dl, 10
    int 21h
    ret

完善proceedConversion函数

proceedConversion:
    call convertToIEEE754
    mov [ieeeValue], eax

    cmp byte ptr [menuOption], 1
    je outputBinary
    cmp byte ptr [menuOption], 2
    je outputHex

    jmp finish

内容的提问来源于stack exchange,提问作者Sergio Emiliano Hernndez Villa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 04:45:02