【问题标题】:How to change variable value in x86_64 assembly (nasm)如何在 x86_64 程序集中更改变量值 (nasm)
【发布时间】:2022-10-14 23:51:11
【问题描述】:

我正在尝试更改 x86_64 asm 中的变量值

这是我的方法

section .data
    text db "Hello, World!",10
   
 
section .text
    global _start
 
_start:
    mov rax, 1
    mov rdi, 1
    mov rsi, text
    mov rdx, 14
    syscall

    mov rax , "He"


    mov  [text], rax
    syscall
   
    

    mov rax, 1
    mov rdi, 1
    mov rsi, text
    mov rdx, 14
    syscall

    mov rax, 60
    mov rdi, 0
    syscall

但这输出

Hello, World!
Heorld!

我曾尝试使用: mov word [text], "He",但这也不起作用

【问题讨论】:

  • 试试strace .\a.out 看看第二个syscall 的参数是什么。在mov rax, 'He'rax=0x0000000000006548`之后,没有实现这个数字的内核函数。

标签: assembly x86-64 nasm


【解决方案1】:

你称之为变量的东西是一个标签,它基本上保存了内存中值的地址。当您想要更改值时,您需要使用方括号 [] 并取消引用指向该位置的地址。然后,您可以一一更改这些值。例如,让我们定义一个单字节变量:

v: db 0x00

要更改您可以执行的值

mov byte[v], 0x02

如您所见,我们使用byte 指定了大小

如果我们有以下变量:

abc: dw 0x0000

变量abc 只会保存数据第一个字节的地址,但数据本身是一个字(2 个字节)。这就是为什么我们需要改变变量的值:

mov word[abc], 0xDEAD

这相当于

mov byte[abc], 0xAD
mov byte[abc+1], 0xDE

请注意,2 字节值的最小第一个字节位于较早的内存地址中,这称为 little-endian 顺序。

字符串本质上是一堆彼此相邻的“字节”(它不使用小端序)。要一一更改字符串值,您可以执行以下操作:

text: db "Hello World", 0

mov byte [text], 'A' ; Aello World
mov byte [text+1], 'B' ; ABllo World
mov byte [text+2], 'C' ; ABClo World
; and etc 

【讨论】:

  • 这很有意义,谢谢,我正在编写一个生成 x86_64 程序集的玩具编译器,这对我很有帮助
猜你喜欢
  • 2016-01-25
  • 2018-02-13
  • 1970-01-01
  • 2018-07-13
  • 2021-06-24
  • 1970-01-01
相关资源
最近更新 更多