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

bsxbgnwa  于 2023-11-19  发布在  其他
关注(0)|答案(3)|浏览(113)
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中。

zd287kbt

zd287kbt1#

数据从地址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”。
(for nitpickers:是的,我知道这是可以优化的。特别是cmp al,0。但是对于初学者来说,最好考虑比较.

w1jd8yoj

w1jd8yoj2#

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

MOV     EDX, OFFSET String1     ; pointer
    MOV     ECX, SIZEOF String1 - 1 ; max byte count, not including terminating 0
    call    ReadString
 ; EAX return value = number of bytes actually read
 ; 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#

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

字符串

相关问题