汇编程序将所有小写字母转换为大写字母

时间:2018-06-21 20:41:51

标签: assembly x86-16

我正在尝试在8086 TASM中编写一个汇编程序,该程序会将所有小写字母转换为大写字母。我是这种汇编语言编程的新手,所以我真的很想知道我在做错什么。谢谢您的任何帮助。到目前为止,我的代码是:

data segment 
sir2 dw 10 dup(?),'$'
sir1 dw 10,?,11 dup(?)
msg1 db 10,13,"introduceti sirul:$"
msg2 db 10,13,"sirul convertit este:$"
len dw ?
data ends

assume ds:data,cs:code
code segment

start:
    mov ax,data
    mov ds,ax
    xor ax,ax
    xor cx,cx
    xor dx,dx
    xor si,si
    mov ah,09h
    lea dx,msg1
    int 21h
    xor dx,dx
    mov ah,0Ah
    lea dx,sir1
    int 21h
    mov cx,sir1[1]
    mov ch,0
    mov len,cx
    mov ch,0
    mov si,2
    dec cx

verify:
    cmp sir1[si],97
    jg uppercase
    inc si
    loop verify

uppercase:
    cmp cx,0

    je endd
    sub sir1[si],20h
    inc si
    dec cx
    jmp verify
endd:
    xor bx,bx
    mov bx,sir1
    mov sir2,bx
    xor dx,dx
    mov ah,09h
    lea dx,sir2
    int 21h
    mov ah,04ch
    int 21h
code ends
end start

1 个答案:

答案 0 :(得分:1)

这不是一个完整的解决方案,因为它看起来好像您想自己进行分配。您想要的伪代码是这样的:

Set the count to 0
For each byte b of input
  if b ≥ 'a'
    if b ≤ 'z'
      Subtract (`a' - 'A`) from b

  Increment the count

Set the following byte to the terminator character '$'

顺便说一句:可能是您的教授选择让您编写16位MS-DOS程序。如果有CS专家正在阅读此书,我强烈建议一种更好的汇编语言教学方法是从HLL中的简单测试驱动程序调用一个子例程。适用于多种语言和操作系统的现代免费编译器完全能够将使用不同语言编写的目标文件链接在一起!此外,这与当今的汇编语言在现实世界中的使用非常接近:编写低级内核代码,检查编译后的代码以查看实际情况,并手动优化对性能至关重要的较大程序的各个部分。