emu 8086 保持符号不变

emu 8086 Keep symbols unchanged

这些代码将大写字母(“仅限字母”)转换为小写字母,将小写字母转换为大写字母。我的问题是我也想打印它们并保持不变,如果有的话(非语言符号和演员)。使用您在程序中看到的 cmp 和 ... 命令

data segment
    ; add your data here!
    ar db "haP!y bi3Rthday$"
ends

stack segment
    dw   128  dup(0)
ends

code segment
start:
; set segment registers:
    mov ax, data
    mov ds, ax
    mov es, ax

    ; add your code here
   mov si,0
   mov ah,01
   int 21h
   cmp al,"c"
   je c
   cmp al,"l"
   je l
   jmp exit
 c:cmp ar[si],"$"
   je exit
   cmp ar[si],96
   jl c2
   sub ar[si],32
 c2:inc si
    jmp c
    
 l: cmp ar[si],"$"
    je exit
    cmp ar[si],96
    jg l2
    add ar[si],32
 l2:inc si
    jmp l
 
 exit:lea dx,ar
      mov ah,09
      int 21h
    
    mov ax, 4c00h ; exit to operating system.
    int 21h    
ends

end start ; set entry point and stop the assembler.

您需要通过指定下限和上限来限制大写和小写字符的范围,而不仅仅是您当前代码使用的一个值 (96)。

大写字符 [A,Z] 在 [65,90]
小写字符 [a,z] 在 [97,122]

当然,好处是您实际上不需要在代码中写入这些数字。你可以只写相关的字符,汇编器会替你代入:

Up: cmp ar[si], "$"
    je  exit
    cmp ar[si], "a"
    jb  Up1
    cmp ar[si], "z"
    ja  Up1
    sub ar[si], 32    ; Make uppercase
Up1:inc si
    jmp Up
    
Lo: cmp ar[si], "$"
    je  exit
    cmp ar[si], "A"
    jb  Lo1
    cmp ar[si], "Z"
    ja  Lo1
    add ar[si], 32    ; Make lowercase
Lo1:inc si
    jmp Lo