assembly 如何在程序集中使用ReadString?

bsxbgnwa  于 2023-11-19  发布在  其他
关注(0)|答案(3)|浏览(135)
  1. mov edx,offset Prompt1
  2. call WriteString
  3. mov ecx,32
  4. mov edx,offset String1
  5. call ReadString

字符串
现在,我该如何访问String1呢?我该如何将它移到一个寄存器中,以便对它进行移位操作呢?
比如说,

  1. mov eax, edx
  2. shr eax, 1


我遇到的问题是,我不知道如何访问String1。它似乎没有进入eax寄存器,但如果我调用WriteString,它就会出现,所以我相信它在EDX中。

zd287kbt

zd287kbt1#

数据从地址String1开始读入内存。在最后一个输入字符后有一个空字节(0)。
因此,如果在call ReadString之后写入mov edx,offset String1,则EDX指向字符串的第一个字符。
然后,您可以处理字符串。例如,为每个字符添加1:

  1. call ReadString
  2. mov edx,offset String1
  3. theLoop:
  4. mov al,[edx]
  5. cmp al,0
  6. jz done ; the character is 0, so done
  7. inc al
  8. mov [edx],al
  9. inc edx ; next character
  10. jmp theLoop
  11. done:

字符串
因此,如果输入是“0123abc”,则会将字符串更改为“1234bdc”。
(for nitpickers:是的,我知道这是可以优化的。特别是cmp al,0。但是对于初学者来说,最好考虑比较.

展开查看全部
w1jd8yoj

w1jd8yoj2#

ReadString需要分别在EDX和ECX中放置缓冲区地址和大小。因此,在引用它之前,您必须确保两个寄存器都具有必要的信息。您可以通过将这些值存储在数据部分中来实现这一点,尽管大小通常只需要是一个时间常数,而不是实际存储在内存中的. data中。
因此,在调用ReadString之前,必须设置两个参数

  1. MOV EDX, OFFSET String1 ; pointer
  2. MOV ECX, SIZEOF String1 - 1 ; max byte count, not including terminating 0
  3. call ReadString
  4. ; EAX return value = number of bytes actually read
  5. ; no other registers modified in Irvine32's unusual calling convention

字符串
Irvine32的在线文档:
https://csc.csudh.edu/mmccullough/asm/help/source/irvinelib/readstring.htm
从标准输入中读取最多包含ECX非空字符的字符串,当用户按Enter键时停止。
空字节存储在字符输入之后,但尾随的回车符和换行符不放入缓冲区。
ECX应始终小于缓冲区大小(永远不等于缓冲区大小),因为空字节可能是存储的第(ECX+1)个字符。
文档中也有一个类似的例子,也显示了预留缓冲区。

展开查看全部
zwghvu4y

zwghvu4y3#

  1. INCLUDE Irvine32.inc
  2. .data
  3. buffer BYTE 21 DUP(0)
  4. byteCount DWORD ?
  5. .code
  6. main PROC
  7. mov edx, OFFSET buffer
  8. mov ecx, SIZEOF buffer
  9. call ReadString
  10. mov byteCount, eax
  11. call writestring
  12. exit
  13. main ENDP
  14. END main

字符串

展开查看全部

相关问题