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
