Не могу изменить память используя 32-битный ассемблер - PullRequest
1 голос
/ 08 сентября 2010

Я использую NASM для сборки кода на ассемблере. Код, который я собрал, выглядит так:

[BITS 32]
[ORG 0]
  jmp 07c0h:start

  testvar db 0, 0, 0, 0, 0, 0, 4, 8, 15, 16, 23, 42

start:
  mov byte [testvar], 47

  hang:
    jmp hang

  times 510-($-$$) db 0
  dw 0AA55h

У меня были проблемы с другим фрагментом кода, я заметил, что не могу изменить память, поэтому я написал этот фрагмент кода, чтобы проверить, так ли это на самом деле. Это было! Я скопировал собранный машинный код в первый сектор дискеты, программа запустилась (я использовал MS VirtualPC). Я проверил оперативную память, выделенную для Virtual PC, и искал числа 4 8 15 16 23 42, чтобы я мог найти, куда был скопирован двоичный код. Первый байт данных не был затронут. Почему это так?

Ответы [ 3 ]

5 голосов
/ 08 сентября 2010

Простой ответ: тот же код, который собран как 32-битный, отличается от того, который собран как 16-битный. Код загрузочного сектора (и весь загруженный код) запускается в 16-битном реальном режиме, пока не будет переключен режим ЦП.

Счастливый ответ - листинг показывает разницу.

                                                [BITS 16]
0000000C: C6 06 00 00 2F                          mov BYTE [testvar], 47

Тот же код, что и 32-битный

                                                [BITS 32]
0000000C: C6 05 00 00 00 00 2F                    mov BYTE [testvar], 47

Эквивалентный код при запуске как 16-битный

                                                [BITS 16]
0000000C: C6 05 00                                mov BYTE [di], 0
0000000F: 00 00                                   add [bx+si], al
00000011: 00 2F                                   add [bx], ch
2 голосов
/ 08 сентября 2010

Установка «BITS 32» в исходном файле влияет только на коды операций, которые ассемблер выдает.

Чтобы выполнить 32-битный код, вам необходимо изменить режим процессора на 32-битный защищенный режим. Как правило, когда вы выходите за пределы своего первого загрузочного сектора, вы загружаете ядро ​​в несколько этапов. Во-первых, 16-битный загрузочный сектор со всеми его размерами. Это загружает 16-битный загрузчик, который, в свою очередь, может установить защищенный режим. В некоторых конструкциях эта 16-битная часть минимальна, а для загрузки ядра используется 32-битный загрузчик, в других - ядро ​​загружается непосредственно из 16-битного загрузчика.

Я предлагаю вам взглянуть на http://wiki.osdev.org/Main_Page, http://www.asmcommunity.net/ и http://board.flatassembler.net/:)

0 голосов
/ 08 сентября 2010

Насколько я понимаю, все ПК-совместимые машины запускаются в 16-битном режиме (по соображениям совместимости). Поэтому мне кажется, что вам нужно начинать с [BITS 16], даже если первая инструкция является переходом в 32-битный режим и сразу же следует [BITS 32]. См. NASM: смешивание 16- и 32-битного кода .

Я немного запутался в процессе загрузки с дискеты. Вы уверены, что код находится там, где он будет выполняться? Возможно ли пошаговое выполнение этого кода?

...