如何获取用户输入并在程序集中转换为大写

how to take user input and convert to uppercase in assembly

我正在尝试获取用户输入的小写字母并在程序集中转换为大写字母。 我在 NASM 中编译了它,但它给出了一个错误。

IDEAL

MODEL small;
STACK 256 

DATASEG
prompt db 13,10,"PLEASE ENTER A CHARACTER IN THE ALPHABET.$"

CODESEG

Start:
  mov ax,@DATA
  mov dx,ax

Mainloop:
  mov ah,9
  mov dx, offset prompt
  int 21h

  mov ah,0
  int 16h

  mov ah,02h
  mov dl,"ah+32"
  int 21h
  jmp Mainloop
  
 END Start

您不能在 16 位模式下将结果直接添加并放入另一个寄存器(除非特殊情况)。尝试

mov ah, 09h ; Function: Write out string
mov dx, offset prompt
int 21h

mov ah, 00h ; Function: Read in keystroke (results in al and ah)
int 16h

mov ah, 02h ; Function: Print out character
mov dl, al  ; ASCII code of lowercase character
add dl, 32  ; To upper case
int 21h

上面几行似乎也有错误。也许您想在那里设置数据段:

mov ax, seg prompt
mov ds, ax
Start:
 mov ax,@DATA
 mov dx,ax

第三行有错误。您要初始化 DS 段寄存器,而不是通用寄存器 DX.

im trying to take a user input, lowercase and convert into UPPERCASE

您的程序无法确保输入确实是小写字母 [a-z],但我认为目前没问题。

mov dl,"ah+32"

一样,本指令不会将32加到AH寄存器中!
你为什么要这样做?

  • (小写)字符在 AL 寄存器中
  • 转换为大写需要您减去 32

[a-z] 的 ASCII 码是 [97-122]
[A-Z] 的 ASCII 码是 [65-90]

真正的解决方案是屏蔽掉 AL 中的第 6 位以摆脱 32。这样做时,如果输入恰好已经是大写字符,您的程序仍会生成所需的大写输出。考虑一下奖金。

下一段代码将生成一个 .COM 程序。这是一种简单的程序格式,其中所有段寄存器彼此相等(CS==DS==ES==SS)。 ORG 256 指令是强制性的。

ORG 256

Mainloop:
  mov dx, prompt
  mov ah, 09h       ; DOS.PrintString
  int 21h

  mov ah, 00h       ; BIOS.GetKey
  int 16h           ; -> AX

  and al, 11011111b ; UCase
  mov dl, al
  mov ah, 02h       ; DOS.PrintChar
  int 21h
  jmp Mainloop

prompt db 13,10,"PLEASE ENTER A CHARACTER IN THE ALPHABET.$"