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

MASM技术求助:输入ASCII码输出对应字符串的实现方法

我来帮你搞定这个MASM的问题!你要实现的是输入ASCII码整数(65-90)输出对应字母字符串的功能对吧?结合你提到的反向项目经验,咱们一步步来拆解:

先纠正一个小误区:MASM里的字符串定义

你用到的.asciiz是MIPS汇编的语法,MASM里咱们得用db(define byte)来定义带空终止符的字符串,比如你原来的提示信息应该这么写:

.data
    ; 提示信息,末尾加0表示空终止
    stringMsg db "Enter 4 integers that are between 65-90, inclusive: ", 0
    ; 如果你想用字母表查表,也可以这么定义(每个字母后跟终止符)
    alphaTable db 'A',0,'B',0,'C',0,'D',0,'E',0,'F',0,'G',0,'H',0,'I',0,'J',0,
               'K',0,'L',0,'M',0,'N',0,'O',0,'P',0,'Q',0,'R',0,'S',0,'T',0,
               'U',0,'V',0,'W',0,'X',0,'Y',0,'Z',0
    ; 存储最终结果的字符串(4个字符+1个终止符)
    resultStr db 5 dup(0)
    ; 错误提示信息
    errorMsg db "Invalid input! Please enter numbers between 65-90.", 0
核心功能实现思路

咱们的目标是:输入4个整数→验证范围→转成对应字符→拼接成字符串输出。这里给你两种实现方式,选你顺手的就行:

方式1:直接利用ASCII码输出(不需要查表)

因为输入的整数本身就是字母的ASCII值,所以只要把这个数值直接作为字符存储就行,不用查表,效率更高。

完整代码示例(基于DOS中断int 21h)

.MODEL SMALL
.STACK 100H

.DATA
    stringMsg db "Enter 4 integers that are between 65-90, inclusive: ", 0
    resultStr db 5 dup(0) ; 4个字符 + 终止符
    errorMsg db "Invalid input! Please enter numbers between 65-90.", 0
    newline db 0Dh,0Ah,0 ; 换行符

.CODE
MAIN PROC
    MOV AX, @DATA
    MOV DS, AX

    ; 显示提示信息
    LEA DX, stringMsg
    CALL PRINT_STR

    ; 循环读取4个整数
    MOV CX, 4
    MOV SI, 0 ; 结果字符串的索引

INPUT_LOOP:
    ; 读取一个整数(调用自定义子程序)
    CALL READ_INT
    ; 验证范围:是否在65-90之间
    CMP AX, 65
    JB SHOW_ERROR
    CMP AX, 90
    JA SHOW_ERROR

    ; 将整数转为字符,存入结果字符串
    MOV resultStr[SI], AL
    INC SI

    LOOP INPUT_LOOP

    ; 输出结果字符串
    LEA DX, newline
    CALL PRINT_STR
    LEA DX, resultStr
    CALL PRINT_STR
    JMP EXIT_PROGRAM

SHOW_ERROR:
    LEA DX, newline
    CALL PRINT_STR
    LEA DX, errorMsg
    CALL PRINT_STR

EXIT_PROGRAM:
    ; 退出程序
    MOV AH, 4CH
    INT 21H

MAIN ENDP

; 子程序:打印空终止字符串
PRINT_STR PROC
    PUSH AX
    PUSH BX
    PUSH CX
    PUSH DX

    MOV AH, 09H ; DOS中断:打印字符串(DS:DX指向字符串首地址)
    INT 21H

    POP DX
    POP CX
    POP BX
    POP AX
    RET
PRINT_STR ENDP

; 子程序:读取整数,返回值在AX中
READ_INT PROC
    PUSH BX
    PUSH CX
    PUSH DX

    MOV AX, 0
    MOV CX, 10
READ_CHAR:
    MOV AH, 01H ; DOS中断:读取一个字符,存在AL中
    INT 21H

    ; 判断是否是数字(0-9)
    CMP AL, '0'
    JB END_READ
    CMP AL, '9'
    JA END_READ

    ; 转换为数值:AX = AX*10 + (AL-'0')
    SUB AL, '0'
    PUSH AX
    MUL CX
    POP BX
    ADD AX, BX
    JMP READ_CHAR

END_READ:
    POP DX
    POP CX
    POP BX
    RET
READ_INT ENDP

END MAIN

方式2:用你定义的alphaTable查表

如果一定要用字母表查表,那可以根据输入的ASCII码计算索引:比如输入65(A),索引是(65-65)*2 = 0,输入66(B)索引是(66-65)*2=2,以此类推,然后从alphaTable中取出对应字符。

只要把上面代码中“将整数转为字符”的部分改成:

; 计算查表索引:(输入值 - 65) * 2
SUB AX, 65
MOV BX, 2
MUL BX
; 从alphaTable中取出字符
MOV AL, alphaTable[AX]
MOV resultStr[SI], AL
INC SI
关键细节提醒
  • 输入验证一定要做:如果用户输入的数字不在65-90之间,要提示错误,不然输出的字符会是乱码
  • 结果字符串一定要加空终止符:咱们定义resultStr db 5 dup(0)的时候已经初始化了最后一位为0,所以只要依次存入4个字符就行
  • MASM里的寄存器使用要注意:操作数据段的时候要确保DS寄存器指向数据段,所以开头必须有MOV AX, @DATA和MOV DS, AX

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:55:14