Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
K-1___[Assembler] [Krupnik].docx
Скачиваний:
4
Добавлен:
01.07.2025
Размер:
90.27 Кб
Скачать

Invoke ExitProcess,0

main endp

End main

ax = 65536 - |-127|

ax = al + X

X = ax – al = 65536 - |-127| - ( 256 - |-127| ) = 65536 - |-127| - 256 + |-127| = 65536 – 256 = 0FFFFh – 00FFh = 0FF00h = 6528010

В al хранится уже код -127 дополненный до 256 ----- al = 256 - |-127|

Байты al, ah и т.д. выступают в арифметических операциях как самостоятельные регистры. Казалось бы, они часть большего регистра, но перенос из старшего разряда al не попадает в ah он только устанавливает флаг С.

Для переноса отрицательного числа в более просторный регистр нужно все биты, стоящие левее знакового, сделать равным единице – операция расширение знака.

Директива .radix 16 предназначена для смены системы счисления принимаемой по умолчанию.

Все байты в памяти (не биты или другие единицы информации!!!) пронумерованы.

.data

data_8 byte -8

data_16 word ?

mov al,data_8

sub ah,ah

dec ah

mov data_16,ax

Любая команда в самом первом байте содержит информацию о ее типе и длине.

Как правило, размер переменных, помещаемых в стек и извлекаемых должен совпадать!

pop – увеличивает адрес, вершины стека, но не стирает сами числа, следующая команда push их уничтожит.

Командой pop можно вытолкнуть только слово или двойное слово. Если нужен байт, то необходимо воспользоваться косвенной адресацией. mov bl,[esp]

При работе со стеком необходимо помнить, что: 1. В памяти числа хранятся в порядке возрастания адресов (младший байт-младший адрес)

2. Стек растет в сторону уменьшения адресов.

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

mov ax,2211h

mov ecx,66554433h

push ax

push ecx

pop ax ; 44 33

pop ecx ; 22 11 66 55

; команды для того чтобы снять со стека «правильные», первоначальные значения регистров ax,2211h ecx,66554433h

mov ax,[esp-2]

mov ecx,[esp-6]

CPU Stack

Address Value ASCII>Comments

0 018FF8A |66554433 3DUf

0018FF8E |919F2211 "џ‘

0018FF92 |E000763A :v а

0018FF96 |FFDC7FFD эЬя

0018FF9A |A8CB0018 ЛЁ

После снятия наших значений.

CPU Stack

Address Value ASCII>Comments

0018FF90 763A919F џ‘:v ; RETURN to KERNEL32.BaseThreadInitThunk+0E

0018FF94 7FFDE000 аэ

0018FF98 0018FFDC Ья

В отладчике, при рассмотрении области стека, как область хранения параметров вызываемой функции, а также локальных переменных, удобно пользоваться «стопкой», т.е. так как это отображается в окне отладчика. Но при рассмотрении стека как последовательности хранимых и снимаемых с вершины байт, удобно пользоваться координатной прямой. 33 44 [55 66 11 22] 9F 91 3A 76

Процедуры нужны для упрощения восприятия кода и упрощения поиска ошибок.

main proc

mov eax,3

mov ecx,2

call AddDig

Invoke ExitProcess,0

main endp

AddDig proc

add eax,ecx

ret

AddDig endp

End main

Option casemap:none директива для различения строчных и прописных букв должна идти перед инклюдниками.

Параметры, передаваемые на стеке – нужно знать их размер, число и порядок следования.

Передача параметров функции возможна через регистры или стек, еще через адрес в памяти.

main proc

mov eax,3

mov ecx,2

push eax

push ecx

call AddDig

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]