如何获取用户输入并在程序集中转换为大写
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.$"
我正在尝试获取用户输入的小写字母并在程序集中转换为大写字母。 我在 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"
与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.$"