emu8086更改输入字符串的大小写并将其反转

时间:2015-11-07 01:27:16

标签: assembly x86 dos x86-16

我在汇编语言编程方面是全新的,我遇到了一个问题,我需要更改输入字符串的大小写以及反转字符串。我正在使用emu8086。我以下代码我要么能够改变大小写或者反转字符串。但我需要同时执行这两项操作。

.MODEL CASECHANGE

.DATA

        MSG1 DB  0DH,0AH, 'Enter string:$'
        MSG2 DB  0DH,0AH, 'String in reverse case:$'
        STR1 DB  255 DUP(?)


.CODE    

START:

          MOV AX,@DATA
          MOV DS,AX 


          LEA DX,MSG1
          MOV AH,09H
          INT 21H 

          LEA SI,STR1
          MOV AH,01H 
          jz offsets  
GET:

        INT 21H
        MOV BL,AL

        CMP AL,0DH
        JE  SET

        XOR AL,20H
        MOV [SI],AL
        INC SI

        JMP GET


SET:

      MOV AL,'$'
      MOV [SI],AL 



      LEA DX,MSG2
      MOV AH,09H
      INT 21H 


      LEA DX,STR1
      MOV AH,09H
      INT 21H 
      MOV AL,09H 

      JMP START
      JMP BACK  
      .EXIT  

下面的代码反转字符串和上面的代码更改大小写,我需要连接两个代码以实现所需的输出。

BACK:

        int 21h 
        MOV BL,AL
        cmp al,0dh

        jz exit  

        mov [si],al 
        inc si
        inc ch 
        jmp back



EXIT:      

        lea dx,MSG2
        mov ah,09h  
        int 21h 

cmp1:       

        mov al,[si]
        mov dl,al
        mov ah,02h
        int 21h
        dec si
        dec ch
        jnz cmp1
        mov ah,01ch
        int 21h


OFFSETS: 

        mov ch,01h
        mov si,offset STR1 

END START 

这两组代码由我的导师提供,因此只能使用此代码。

1 个答案:

答案 0 :(得分:2)

我没有真正阅读过大量未注释的代码。

要在原地反转缓冲区,获取指向第一个和最后一个字符的指针,然后:

  • 将字节加载到寄存器中,然后将相反的寄存器存储回指针。

  • 递增开始指针si,递减结束指针di

  • 循环只要开始<结束:cmp si, di / jb

可以对单个字符进行下行,因此当您在交换时将它们放在寄存器中时,可以分别对两个字节执行此操作。只需检查它是否在'A''Z'之间,然后添加0x20。 (遗憾的是,除非您知道您的角色已经是大写字母,而不是其他一些ASCII字符,否则不能or al, 20H

转换到新缓冲区更加容易。只需在一个数组中前进,然后在另一个数组中前进,为count个字节。

如果您的目标基线CPU功能集包含386条指令,则您可以一次加载4B并使用bswap一次反转字节4。或者使用SSSE3,pshufb一次反转16B。