147
правок
Изменения
м
Нет описания правки
==Регистры==
Регистры -- основная память в ассемблере.
==Команды==
Команды загрузки
mov -- команда загрузки. mov al, 5 -- загрузить в al 5
Обычно первый аргумент команды -- то, что меняется.
mov cx, di -- скопировать значения cx в di. Размер копируемых данных должен совпадать. movzx -- размер игнорируется; то, что осталось, заполняется нулями movcx -- размер игнорируется; то, что осталось, заполняется знаковым (старшем) битом mov(cc): cc -- условие. если cc, то mov, ничего otherwise xchg -- обмен значений регистров
bswap -- меняет порядок байт в регистре на обратный (little в big, big в little)
Уточнение про порядок байт:
//little-endian:
//байты загружаются в память в порядке:
любой из регистров общего назначения + (любой из регистров общего назначения, за исключением esp)*(1|2|4|8) +(-) offset (32-битное число)
push eax -- положить eax на стек.
Сишный псевдокод:
//malloc и free -- системные функции, их можно свободно использовать в любом языке (и в Си, и здесь, и в дельфи)
pusha(d) -- сохранить в стек все 8 регистров общего назначения popa(d) -- вытащить их из стека
(push|pop)ad работают с 32-битными регистрами, (push|pop)a - c 16-битными
//в документации указана обработка всего этого в 8- и 16-битных случаях
imul и idiv -- аналогично mul и div, НО: работают со знаковыми числами
кроме того, у imul есть такие формы записи:
imul ecx, ebx == ecx *= ebx (верхние биты обнуляются) imul ecx, ebx, 5 == ecx = ebx * 5
inc и dec. принимают один операнд, увеличивают (уменьшают) его на один; не трогают знак переноса
Команда, которая неизвестно для чего изначально нужна.
Так же есть условия, зависящие от флагов:
j(cc)
ex.: jz -- условный переход, если флаг нуля установлен.
jnz -- переход, если флаг нуля не установлен.
jc, jnc -- аналогично для флага переноса, и так далее... тысячи их!