如何在Assembly中使用ReadString?

问题描述 投票:0回答:3
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 中。

assembly irvine32 masm32
3个回答
4
投票

数据从

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
。但是对于初学者来说最好考虑比较......当他们牢牢掌握了处理器的工作原理后,我们可以进行优化水平。)


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

0
投票

ReadString需要分别放入EDX和ECX的缓冲区地址和大小。因此,在引用之前,您必须确保两个寄存器都具有必要的信息。您可以通过将这些值存储在数据部分中来做到这一点。

所以在调用 WriteString 之前 MOV EDX、OFFSET 字符串 1 MOV ECX,SIZEOF 字符串 1

© www.soinside.com 2019 - 2024. All rights reserved.