我在汇编语言编程方面是全新的,我遇到了一个问题,我需要更改输入字符串的大小写以及反转字符串。我正在使用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
这两组代码由我的导师提供,因此只能使用此代码。
答案 0 :(得分:2)
我没有真正阅读过大量未注释的代码。
要在原地反转缓冲区,获取指向第一个和最后一个字符的指针,然后:
将字节加载到寄存器中,然后将相反的寄存器存储回指针。
递增开始指针si
,递减结束指针di
。
循环只要开始<结束:cmp si, di / jb
可以对单个字符进行下行,因此当您在交换时将它们放在寄存器中时,可以分别对两个字节执行此操作。只需检查它是否在'A'
和'Z'
之间,然后添加0x20。 (遗憾的是,除非您知道您的角色已经是大写字母,而不是其他一些ASCII字符,否则不能or al, 20H
。
转换到新缓冲区更加容易。只需在一个数组中前进,然后在另一个数组中前进,为count
个字节。
如果您的目标基线CPU功能集包含386条指令,则您可以一次加载4B并使用bswap
一次反转字节4。或者使用SSSE3,pshufb
一次反转16B。