请求协助完成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
相关产品推荐
相关产品推荐

