【问题标题】:How do I use ReadString in Assembly?如何在 Assembly 中使用 ReadString?
【发布时间】:2014-11-27 00:24:02
【问题描述】:
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


【解决方案1】:

数据从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。但初学者最好考虑比较……我们可以在他们牢牢掌握在处理器级别。)

【讨论】:

    【解决方案2】:
    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
    

    【讨论】:

    • 虽然此代码可以解决问题,including an explanation 说明如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人。请edit您的回答添加解释并说明适用的限制和假设。
    猜你喜欢
    • 2018-12-11
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 2011-07-28
    • 1970-01-01
    • 2019-03-26
    • 2020-09-28
    • 2020-05-17
    相关资源
    最近更新 更多