NASM Windows ReadConsole NumberOfCharsRead Buffer

时间:2015-03-12 13:23:38

标签: winapi assembly console nasm x86-64

我正在尝试转换我拥有的现有程序集程序,以便它可以在Windows上运行。它应该询问用户他们的名字,然后输出“你好名字”。我几乎让它工作但是从ReadConsole调用中获取实际读取的字符数有问题。

我的节目是:

extern ExitProcess                          ;windows API function to exit process
extern WriteConsoleA                        ;windows API function to write to the console window (ANSI version)
extern ReadConsoleA                         ;windows API function to read from the console window (ANSI version)
extern GetStdHandle                         ;windows API to get the for the console handle for input/output

section .data                               ;the .data section is where variables and constants are defined

hello       db      'Hello '                ;db stands for 'define byte'
length      equ     $-hello                 ;get the length of the hello
                                            ;$ is the current memory location
                                            ;$-hello means the difference between the current location and
                                            ;where hello started

enter_name  db      'Please enter your name: '
name_len    equ     $-enter_name

chars       dd      0

section .bss                                ;the .bss section is where space is reserved for additional variables

name:
    resb    30                              ;reserve 30 bytes of space for the name

char_written:
    resb    4

section .text                               ;the .text section is where the program code goes

global _main                                ;tells the machine which label to start program execution from

_main:
    ;get the output handle
    mov rcx, -11                        ;specifies that the output handle is required
    call GetStdHandle                   ;returns value for handle to rax

    ;print message asking user for their name
    mov rcx, rax
    mov rdx, enter_name                 ;load the address of enter name message into rsi
    mov r8, name_len                    ;move the length into the rdx register
    mov r9, char_written

    call WriteConsoleA

    ;get the input handle
    mov rcx, -10                        ;specifies that the input handle is required
    call GetStdHandle

    ;get value from keyboard
    mov rcx, rax                        ;place the handle for operation
    mov rdx, name                       ;set name to receive input from keyboard
    mov r8, 30                          ;max number of characters to read
    mov r9, chars                       ;stores the number of characters actually read

    call ReadConsoleA

    ;print 'hello' + user's name message

    ;get the output handle
    mov rcx, -11                        ;specifies that the output handle is required
    call GetStdHandle                   ;returns value for handle to rax

    ;print message asking user for their name
    mov rcx, rax
    mov rdx, hello                      ;load the address of enter name message into rsi
    mov r8, length                      ;move the length into the rdx register
    mov r9, char_written

    call WriteConsoleA

    mov rcx, -11                        ;specifies that the output handle is required
    call GetStdHandle                   ;returns value for handle to rax

    ;print name
    mov rcx, rax
    mov rdx, name                        ;load the address of enter name message into rsi
    mov r8, chars                        ;move the length into the rdx register
    mov r9, char_written

    call WriteConsoleA


    ;exit the program

    mov rcx, 0                          ;exit code?
    call ExitProcess

我在ReadConsole上阅读Windows API文档的方式是它需要以下参数:

  • 输出句柄
  • 放置读取数据的位置
  • 要读取的字符数的值
  • 放置实际读取的字符数

我已经定义了一个标签name来接收字符,chars来接收实际的字符数。

阅读电话如下:

;get the input handle
mov rcx, -10                        ;specifies that the input handle is required
call GetStdHandle

;get value from keyboard
mov rcx, rax                        ;place the handle for operation
mov rdx, name                       ;set name to receive input from keyboard
mov r8, 30                          ;max number of characters to read
mov r9, chars                       ;stores the number of characters actually read

call ReadConsoleA

我的假设是,如果输入的名称是 Anna ,那么值 4 5 (包括换行符)应存储在字符。这似乎不是这种情况,因为当我尝试输出名称时,我对此代码一无所知:

mov rcx, -11                        ;specifies that the output handle is required
call GetStdHandle                   ;returns value for handle to rax

;print name
mov rcx, rax
mov rdx, name                        ;load the address of enter name message into rsi
mov r8, chars                        ;move the length into the rdx register
mov r9, char_written

call WriteConsoleA

但如果我将chars标签切换为一个值,它按预期工作,即

mov rcx, -11                        ;specifies that the output handle is required
call GetStdHandle                   ;returns value for handle to rax

;print name
mov rcx, rax
mov rdx, name                        ;load the address of enter name message into rsi
mov r8, 4                        ;move the length into the rdx register
mov r9, char_written

call WriteConsoleA

显然我对这个缓冲区做错了 - 任何帮助都会非常感激。

0 个答案:

没有答案