(使用 Visual Studio 語法的匯編代碼)我知道這是一個顯而易見的問題,但我是匯編新手。
我很難理解esiregister 在這樣的練習中是如何作業的:
#include <stdio.h>
int main()
{
int a = 0;
int b[5] = { 1, 2, 3, 4, 5 };
int *c;
c = &b[0];
__asm {
mov ebx, c
mov eax, dword ptr [ebx]
mov esi, 3
add eax, dword ptr [ebx esi*4]
mov ecx, eax
mov a, ecx
}
printf("sum of first and fourth element is: %d", a);
}
我需要列印第一個和第四個元素的總和。該程式的作業原理如下:
- 定義
a和陣列b,定義指標c,它指向的第一個元素b。 - 搬進
c來ebx。[c指向第一個元素,因此ebx包含第一個元素] - 將指標指向的東西移動到
eax暫存器中。[這是ebx] - 進入
3注冊esi。【關鍵部分沒看懂】 - 添加運算子 [我不明白的關鍵部分]
- 移動操作員[簡單的部分,沒問題]
我的問題是:
- 為什么我必須復制
3到esi暫存器中? - 為什么我必須做這個操作?
[ebx esi*4]
我知道esi讓事情變得更容易,但我不明白如何使用這個暫存器。
uj5u.com熱心網友回復:
添加陣列的第一個和第四個元素b是這樣寫的:
int a = b[0] b[3];
由于指標c被初始化為指向 的第一個元素b,這相當于
int a = c[0] c[3];
要添加c[3]包含ebx的值c,代碼設定esi為3并使用add eax, dword ptr [ebx esi*4]。該指令將從記憶體中讀取的 32 位值相加到由ebxat index指向的陣列中esi,乘以int直接作為尋址模式的一部分的大小。
如果包含某些計算的結果或引數的值,這將是有用且高效esi的,但對于常量索引,更簡單的方法是在編譯時計算偏移量:
add eax, dword ptr [ebx 12]
另請注意,ecx用于存盤結果也是多余的。
這是一個簡化版本:
#include <stdio.h>
int main() {
int a;
int b[5] = { 1, 2, 3, 4, 5 };
int *c = b;
__asm {
mov ebx, c
mov eax, dword ptr [ebx]
add eax, dword ptr [ebx 12]
mov a, eax
}
printf("sum of first and fourth element is: %d\n", a);
return 0;
}
ebx但是請注意,尚不清楚匯編代碼是否會對或沒有后果產生副作用esi......
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/514903.html
