在 Masm 中将 BYTE 读取为 DWORD

发布于 2024-08-24 14:11:16 字数 264 浏览 5 评论 0原文

我再次进行 MASM 编程。我正在尝试使用 Irvine32 库编写一个过程,其中用户输入一个字符串,该字符串通过 ReadString 放入 BYTE 数组中。然后它循环该数组并确定每个字符是否是数字。 然而,当我尝试

cmp [buffer + ecx], 30h

MASM 时,它抱怨比较两个大小不同的东西。无论如何,我是否可以将数组中每个字节中的 ASCII 代码作为 DWORD 读取(或者以其他方式提取每个字节中的 ASCII 值)?

once again I'm doing MASM programming. I'm trying to write a procedure using the Irvine32 library where the user enters a string which is put into an array of BYTEs with ReadString. Then it loops over that arrray and determines if each character is a number.
However, when I try

cmp [buffer + ecx], 30h

MASM complains about comparing two things that are not the same size. Is there anyway I could read the ASCII code in each BYTE in the array as a DWORD (or otherwise extract the ASCII value in each BYTE)?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

岁月蹉跎了容颜 2024-08-31 14:11:16

这有效吗?

cmp BYTE PTR [buffer + ecx], 30h

要将 BYTE 提取为 DWORD,您可以执行以下操作:

mov EAX, 0
mov AL, [pointer]

或者甚至更好(感谢 Martin):

movzx EAX, [pointer]

Does this work?

cmp BYTE PTR [buffer + ecx], 30h

To extract a BYTE as a DWORD you can do something like this:

mov EAX, 0
mov AL, [pointer]

or even better (thanks Martin):

movzx EAX, [pointer]
听,心雨的声音 2024-08-31 14:11:16
getData PROC
    push ebp
    mov ebp, esp
    mov esi, [ebp + 12] ; offset of buffer
    mov ebx, [ebp + 8] ; where to write answer

    GETNUMBERSTRING:
    mov edx, esi
    mov ecx, BufferSize
    mov eax, 0
    call ReadString

    mov ecx, eax ; set size to loop counter
    cld

    mov edx, 0
    PROCESSSTRING:
    lodsb

    cmp al, 30h
    jl WRONG
    cmp al, 39h
    jg WRONG

    ; add digit into total edx
    sub al, 30h
    push eax ; multiply edx by 10
    push ecx
    mov eax, edx
    mov ecx, 10
    mul ecx
    mov edx, eax
    pop ecx
    pop eax

    push ebx ; add to the total
    movsx ebx, al
    add edx, ebx
    pop ebx

    loop PROCESSSTRING
    jmp DONE

    WRONG:
    call Crlf
    stringWriterEndl invalid
    jmp GETNUMBERSTRING

    DONE:
    mov [ebx], edx
    pop ebp
    ret 8
getData ENDP

这就是我需要做的。

getData PROC
    push ebp
    mov ebp, esp
    mov esi, [ebp + 12] ; offset of buffer
    mov ebx, [ebp + 8] ; where to write answer

    GETNUMBERSTRING:
    mov edx, esi
    mov ecx, BufferSize
    mov eax, 0
    call ReadString

    mov ecx, eax ; set size to loop counter
    cld

    mov edx, 0
    PROCESSSTRING:
    lodsb

    cmp al, 30h
    jl WRONG
    cmp al, 39h
    jg WRONG

    ; add digit into total edx
    sub al, 30h
    push eax ; multiply edx by 10
    push ecx
    mov eax, edx
    mov ecx, 10
    mul ecx
    mov edx, eax
    pop ecx
    pop eax

    push ebx ; add to the total
    movsx ebx, al
    add edx, ebx
    pop ebx

    loop PROCESSSTRING
    jmp DONE

    WRONG:
    call Crlf
    stringWriterEndl invalid
    jmp GETNUMBERSTRING

    DONE:
    mov [ebx], edx
    pop ebp
    ret 8
getData ENDP

That's what I needed to do.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文