2012-04-15 2 views
0

PLATFORM: Процессор Pentium 4 (мне действительно нужно обновить :) под управлением Windows XP. В настоящее время я собираюсь с MASM32.x86 сборка, как добавить переменные, хранящиеся в памяти?

Я являюсь абсолютным новичком со сборкой, и я пытаюсь выяснить, как добавить переменные. Я понимаю, как определять переменные, размещать данные в регистре и как размещать регистры в стеке, но я не знаю, как объединить значения двух переменных (путем добавления).

Кроме того, может ли кто-нибудь дать мне ссылку или что-то в понятном учебнике по сборке x86, все те, что я нашел до сих пор, являются действительно высокоуровневыми материалами, и они не очень многое объясняют. Это было бы действительно оценено.

Спасибо заранее, Progrmr

ответ

4

Простое добавление:

add eax, ebx ; Adds eax and ebx and stores the result in eax 

Загрузка из памяти, а затем добавить, а затем хранить в памяти:

mov eax, DWORD PTR [esi] ; Load a double word from memory into eax 
mov ebx, DWORD PTR [edi] ; Load a double word from memory into ebx 
add eax, ebx    ; Adds eax and ebx and stores the result in eax 
mov DWROD PTR[esi], eax  ; Store a double word in eax into memory 

В приведенных выше примерах, DWORD PTR не является строго необходимы , но это хорошая привычка практиковать, потому что она устраняет любую двусмысленность и делает код более удобным для чтения.

Важно помнить, что вы можете добавлять регистры одного размера (DWORD в приведенных выше примерах). Если вы хотите добавить два регистра различных размеров:

mov al, BYTE PTR [esi] ; Loads a single byte from memory into al 
mov bx, WORD PTR [edi] ; Loads a word from memory into bx 
movzx eax, al    ; Zero extends al into the entire eax register 
movzx ebx, bx    ; Zero extends bx into the entire ebx register 
add eax, ebx    ; Adds eax and ebx and stores the result in eax 

Это не очень хороший пример, потому что есть более простые способы сделать то же самое, но, надеюсь, это будет показать некоторые трюки, которые можно использовать ,

Вы также можете добавить значение памяти до регистров:

mov eax, DWORD PTR [esi]  ; Load a double word from memory into eax 
add eax, DWORD PTR [edi]  ; Add a double word in memory to eax 

Вот хороший сайт для использования в качестве ссылки: http://ref.x86asm.net/

+0

Спасибо, кучи! Это было полезно. Что вы подразумеваете под «Есть более простые способы сделать то же самое». В любом случае, спасибо. – Progrmr

+0

А также, когда я добавляю два числа, как бы я хотел поместить это значение в переменную и отобразить эту переменную на консоли? Благодарю. – Progrmr

+0

Вместо отдельной инструкции mov/movzx вы можете просто сделать это: movzx eax, BYTE PTR [esi]. Что касается получения и печати с консоли, попробуйте эту ссылку: http://www.masm32.com/board/index.php?topic=1094.0 – Sparafusile

0

Я подозреваю, что вы концептуальную проблему. Значения x86 живут в регистры или память, концепция переменной - более высокий уровень. Один из способов добавить значения - это ввести их в регистры, а затем вызвать операцию добавления.

http://computertech.createmybb3.com/showthread.php?tid=116

+0

Хорошо, что имеет смысл. – Progrmr

 Смежные вопросы

  • Нет связанных вопросов^_^