mov edx,offset Prompt1
call WriteString
mov ecx,32
mov edx,offset String1
call ReadString
现在,我该如何访问
String1
?如何将其移入寄存器以便对其进行移位操作?
例如,
mov eax, edx
shr eax, 1
我遇到的问题是我不知道如何访问
String1
。它似乎不会进入 eax 寄存器,但如果我调用 WriteString
它就会出现,所以我相信它在 EDX 中。
数据从
String1
地址开始读入内存。最后一个输入字符后有一个空字节 (0)。
因此,如果在
call ReadString
之后写 mov edx,offset String1
,则 EDX 指向字符串的第一个字符。
然后您可以处理该字符串。例如,要为每个字符加 1:
call ReadString
mov edx,offset String1
theLoop:
mov al,[edx]
cmp al,0
jz done ; the character is 0, so done
inc al
mov [edx],al
inc edx ; next character
jmp theLoop
done:
因此,如果输入是“0123abc”,则会将字符串更改为“1234bdc”。
(对于吹毛求疵的人:是的,我知道这可以优化。特别是
cmp al,0
。但是对于初学者来说最好考虑比较......当他们牢牢掌握了处理器的工作原理后,我们可以进行优化水平。)
INCLUDE Irvine32.inc
.data
buffer BYTE 21 DUP(0)
byteCount DWORD ?
.code
main PROC
mov edx, OFFSET buffer
mov ecx, SIZEOF buffer
call ReadString
mov byteCount, eax
call writestring
exit
main ENDP
END main
ReadString需要分别放入EDX和ECX的缓冲区地址和大小。因此,在引用之前,您必须确保两个寄存器都具有必要的信息。您可以通过将这些值存储在数据部分中来做到这一点。
所以在调用 WriteString 之前 MOV EDX、OFFSET 字符串 1 MOV ECX,SIZEOF 字符串 1