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中。
3条答案
按热度按时间zd287kbt1#
数据从地址
String1
开始读入内存。在最后一个输入字符后有一个空字节(0)。因此,如果在
call ReadString
之后写入mov edx,offset String1
,则EDX指向字符串的第一个字符。然后,您可以处理字符串。例如,为每个字符添加1:
字符串
因此,如果输入是“0123abc”,则会将字符串更改为“1234bdc”。
(for nitpickers:是的,我知道这是可以优化的。特别是
cmp al,0
。但是对于初学者来说,最好考虑比较.w1jd8yoj2#
ReadString
需要分别在EDX和ECX中放置缓冲区地址和大小。因此,在引用它之前,您必须确保两个寄存器都具有必要的信息。您可以通过将这些值存储在数据部分中来实现这一点,尽管大小通常只需要是一个时间常数,而不是实际存储在内存中的. data中。因此,在调用
ReadString
之前,必须设置两个参数字符串
Irvine32的在线文档:
https://csc.csudh.edu/mmccullough/asm/help/source/irvinelib/readstring.htm
从标准输入中读取最多包含ECX非空字符的字符串,当用户按Enter键时停止。
空字节存储在字符输入之后,但尾随的回车符和换行符不放入缓冲区。
ECX应始终小于缓冲区大小(永远不等于缓冲区大小),因为空字节可能是存储的第(ECX+1)个字符。
文档中也有一个类似的例子,也显示了预留缓冲区。
zwghvu4y3#
字符串