【问题标题】:Assembly: how to store data into variable汇编:如何将数据存储到变量中
【发布时间】:2015-04-25 12:10:16
【问题描述】:

我用汇编代码编写了一个简单的程序(打开控制台并循环输入,直到用户输入5)。我想将每个输入存储在变量 input 中(新输入将覆盖旧输入)。这是我的代码:

format PE console
entry start

include 'win32a.inc'

;======================================
section '.data' data readable writeable
;======================================

input      db "", 0

;=======================================
section '.code' code readable executable
;=======================================

start:
        ccall   [getchar] ; Wait for input
        cmp     eax, "5"  ; Compare input with string
        je      exit      ; If it is equal, then exit
        jne     start     ; If not, wait for input again
exit:
        stdcall [ExitProcess], 0

;====================================
section '.idata' import data readable
;====================================

library kernel,'kernel32.dll',\
        msvcrt,'msvcrt.dll'

import  kernel,\
        ExitProcess,'ExitProcess'

import  msvcrt,\
        printf,'printf',\
        getchar,'_fgetchar'

我试着写

    ccall   [getchar] ; Wait for inout
    cmp     eax, "5"  ; Compare input with string

    mov     [input], eax ; This line is added

    je      exit      ; If it is equal, then exit
    jne     start     ; If not, wait for input again

但我收到错误 Operand sizes do not match.。我已经搜索过这个错误,但没有找到任何有用的东西。

【问题讨论】:

  • mov [input], eax 是一个 4 字节的值移动(eax 的大小),但 input 是一个 db(字节)。试试mov [input], al(移动eax的低字节)。

标签: assembly


【解决方案1】:

eax寄存器是32位(4字节)寄存器,但input的数据类型是字节。

您需要双字数据来存储 32 位值:

input      dd 0

注意:eax 中的数据实际上不是字符串。当您将其与"5" 进行比较时,值"5" 将转换为32 位值,即0x00000005。将input 声明为长度为零的字符串不仅使其类型错误,而且它太小而无法容纳 4 字节值,因为它只有 1 字节大(字符串终止符)。

【讨论】:

  • 谢谢,这很好用。我还有一个问题:如何显示变量input 的地址?我试过ccall [printf], input,但它只显示它的值。
  • @Mathematician171:使用格式字符串,以便例程知道将值显示为数字,而不是字符串:stackoverflow.com/questions/8622938/…
  • 我试过了。当我写ccall [printf], formatstring, input 时,它会在textstring 变量的基址10 中显示地址,而不是input 变量。
  • @Mathematician171:textstring 变量在哪里?
  • 我启动了我的应用程序,它显示4198410。这是十进制值,所以我将其转换为十六进制。然后我打开作弊引擎并浏览了这个地址的内存区域,但它的值是%d(它的值是formatstring,我使用的这个变量和你的链接中的完全一样),当我输入一些东西时,那个值没有不改变。
猜你喜欢
  • 1970-01-01
  • 2018-04-15
  • 1970-01-01
  • 1970-01-01
  • 2017-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多