Как я могу использовать mov si, word [ecx] в коде сборки x86 с MASM? - PullRequest
0 голосов
/ 29 августа 2018

У меня есть набор инструкций в коде сборки x86, который выглядит следующим образом:

[0x401240]
mov edx, str.HelloWorld
mov eax, ecx
push esi
   |
   |
   v
[0x401248]
mov si, word [eax]
cmp si, word [edx]
jne 0x40126e

Где ecx - строка, которую я передаю в программу после ее запуска. Я совершенно новичок в сборке, поэтому я не совсем уверен, что здесь происходит, но я думаю, что строка mov si, word [eax] говорит: «возьмите два байта из eax и установите si равным этому. чтобы проверить это, я хотел написать свой собственный маленький скрипт для вывода на консоль результатов этой операции. Поэтому, используя учебники из Интернета, я собрал это:

.386
.model flat, stdcall
option casemap :none

include \masm32\include\kernel32.inc
include \masm32\include\masm32.inc
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\masm32.lib

.data
    message db "Hello world!", 0

.code

main:
    mov si, word [message]
    invoke StdOut, si
    invoke ExitProcess, 0
end main

К сожалению, выполнение этого через \masm32\bin\ml /c /Zd /coff test.asm приводит к test.asm(16): error A2009: syntax error in expression. Как я могу исправить это и проверить свою гипотезу?

1 Ответ

0 голосов
/ 29 августа 2018

mov si, word [message] - это синтаксис NASM. Эквивалент в MASM

mov si, word ptr [message]

Почти все процедуры для 32-битных Windows нуждаются в качестве аргументов DWORD. SI - это СЛОВО. Изменение

invoke StdOut, si

до

invoke StdOut, esi

Процедуре MASM32 StdOut требуется указатель на строку с нулевым символом в конце. С MOV вы получите значение, а не указатель. Используйте LEA, чтобы получить указатель. Изменение

mov si, word ptr [message]

до

lea esi, [message]

В качестве альтернативы вы можете сразу загрузить указатель:

mov esi, OFFSET message

Ответ на вашу основную проблему: mov si, word [eax] загружает СЛОВО, на которое указывает EAX, в регистр SI, который является нижней частью ESI. Скрипт для тестирования должен выглядеть так:

INCLUDE \masm32\include\masm32rt.inc

.data
    message db "Hello world!", 0

.code

main:
    xor esi, esi
    mov eax, OFFSET message
    mov si, WORD PTR [eax]

    printf ("0x%x",esi)

    invoke ExitProcess, 0
end main
...