2015-11-07 697 views
-3

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

这两组代码是我的老师提供的,所以只能用这段代码玩。

回答

2

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

要反转就地缓冲液,得到指向第一和最后一个字符,然后:

  • 装入字节到寄存器,然后存储相反寄存器回指针。

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

  • 环路只要开始<末:cmp si, di/jb

Downcasing可以在一个角色来完成,所以你可以做两个字节分开,当你在你的寄存器让他们”重新交换。只需检查它在'A''Z'之间,然后添加0x20。 (你不幸只能用or al, 20H,除非你的知道你的角色已经是小写或大写字母了,而不是其他的ASCII字符)。

反转到一个新的缓冲区更容易。只需前往一个阵列,然后在另一个阵列前进,即可获得count字节。

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

+0

EMU8086只模拟一个8086,没有更多。一般而言,你的最终评论是正确的,但在OP案例中,它不会成立。我知道你确实说**,如果** –

+1

@MichaelPetch:是的,这就是为什么我说“如果你的目标包括”,过去式,而不是“如果你的目标包括”。由于OP正确地用8086标记了问题,甚至提到了emu8086,这很清楚(这是对某些问题的一个很好的改变)。嗯,我应该问。已经说过“你可以装载”,以使句子的其余部分与过去式相匹配。 –

相关问题