【问题标题】:how to take user input and convert to uppercase in assembly如何在汇编中获取用户输入并转换为大写
【发布时间】:2020-07-28 16:10:19
【问题描述】:

我试图接受用户输入,小写并在汇编中转换为大写。 我在 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

【问题讨论】:

  • NASM 报错?我希望如此,那不是 NASM 语法!这些是 MASM 指令。包括实际的错误消息以使其成为minimal reproducible examplemov dl,"ah+32" 不是语法错误,但它不能满足您的要求。 "ah+32" 是大数字常量,使用 ASCII 文字编写
  • @Peter Cordes:“理想”模式属于 Turbo Assembler,所以我认为这就是它的目的。
  • @ecm:谢谢,很好,我只看到了end startoffset,并没有仔细看。 MASM 和 TASM 属于同一个 Intel 语法家族,所以我仍然可以说它是 MASM 系列语法:P

标签: assembly user-input nasm x86-16 uppercase


【解决方案1】:
Start:
 mov ax,@DATA
 mov dx,ax

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

我正在尝试接受用户输入,小写并转换为大写

您的程序无法确保输入确实是小写 [a-z],但我认为目前还可以。

mov dl,"ah+32"

作为Peter commented,这条指令不会给AH寄存器加32!
你为什么要这样做?

  • (小写)字符在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.$"

【讨论】:

    【解决方案2】:

    您不能只将结果添加到另一个 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
    

    【讨论】:

    • 那仍然不是 NASM 语法;注意问题上的标签。在 OP 清除他们正在使用的汇编程序之前,几乎无法回答。 (然后它可能是重复的,除非值得回答以准确解释 mov dl,"ah+32" 在 NASM 语法中的含义:使用 ASCII 文字的大数字常量,即使在 32 位立即数中也无法容纳,因此会给出警告。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多