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
相关产品推荐
相关产品推荐

