2015-11-07 687 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,這很清楚(這是對某些問題的一個很好的改變)。嗯,我應該問。已經說過「你可以裝載」,以使句子的其餘部分與過去式相匹配。 –

相關問題