我正在嘗試更改 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" 但這也不起作用
uj5u.com熱心網友回復:
不管syscall記憶體修改后的奇數,輸出的原因如下。地址的最初位元組text是:
0 1 2 3 4 5 6 7 8 9 a b c d
48 65 6c 6c 6f 2c 20 57 6f 72 6c 64 21 0a
H e l l o , ' ' W o r l d ! \n
后
mov rax , "He"
rax在兩個低位元組中包含 0x6548,其他六個位元組為零。由于 x86_64 是小端,因此
mov [text], rax
記憶體是:
0 1 2 3 4 5 6 7 8 9 a b c d
48 65 00 00 00 00 00 00 6f 72 6c 64 21 0a
H e \0 \0 \0 \0 \0 \0 o r l d ! \n
零位元組只是沒有列印在終端上。
uj5u.com熱心網友回復:
你稱之為變數的東西是一個標簽,它基本上保存了記憶體中值的地址。當您想要更改值時,您需要使用括號[]并取消參考指向該位置的地址。然后,您可以一一更改這些值。例如,讓我們定義一個單位元組變數:
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
最后我們可以看看你的代碼:
text db "Hello, World!",10
mov rax , "He"
mov [text], rax
syscall
這是無效的(正如@vitsoft 所指出的那樣),因為您在呼叫which之前將其"He"放入其中以確定它將做什么。raxsyscallrax
事實上這行代碼
mov word [text], "He"
是完全有效的。我不知道你為什么不能讓它作業。"He"基本上解決了0x6548和你做一個正常mov的作為一個詞。正如我之前提到的,由于單詞的小端順序,0x48 ('H')將放置在 is already 的第一個位元組中text,"H"同樣0x65 ('e')將放置在textis already的第二個位元組中"e"。
編輯:
假設您不知道要復制到另一個字串/位置的字串的長度。在這種情況下,您應該遍歷該字串并一一進行更改。我將在此處留下一個示例代碼,您需要對其進行修復和調整:
start:
xor ecx, ecx ; initialize some variable to keep count
.loop:
mov al, byte [other rcx] ; get the nth character of other.
cmp al, 0x00 ; if we reached the end of the string
je endLoop ; end the function
mov [text rcx], al ; write the nth character of other to nth position of text
inc ecx ; increase counter
jmp .loop ; loop
endLoop:
ret
text: db "Hello World", 0
other: db "ABC", 0
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/515474.html
標籤:Intel Collective 部件x86-64鼻涕虫
上一篇:裝配,在陣列中移動
