Сохранен 90
https://2ch.hk/pr/res/529357.html
Прошлые домены больше не функционируют, используйте адрес ARHIVACH.HK.
24 декабря 2023 г. Архивач восстановлен после серьёзной аварии. К сожалению, значительная часть сохранённых изображений и видео была потеряна. Подробности случившегося. Мы призываем всех неравнодушных помочь нам с восстановлением утраченного контента!

АССЕМБЛЕРА ТРЕД

 Аноним 13/08/15 Чтв 11:21:34 #1 №529357 
14394540946940.png
не нашел - создал
антоха, такая тема, вынужден по определенным обстоятельствам не зная ассемблера переводить прогу на нем с синтаксиса Intel на AT&T (лучше даже не спрашивай, как я до такого докатился). в общем-то со всем разобрался, кроме пары строк.
mov dword [dword GDT_ADDRESS+DESCRIPTOR_ADDRESS+4],
(CS_BASE&0xff000000) | (0x00cf9a00) |
(CS_BASE&0x00ff0000)>>16
во-первых, хуй знает, почему в исходнике это на трех строках. я вообще не слышал о многострочном mov. ладно, черт с ним, переводами строки и табуляцией пренебрежем - получается вроде бы обычный мов, только с одним но.
если просто поменять операнды местами и заменить квадратные скобки на круглые (а именно так нужно поступать с скобками при переводе, разве нет?), получаем too many memory references for 'mov', что вполне оправданно - из памяти в память низя. значит, что-то из операндов - константа.
константы в чертовом AT&T отличаются знаком $ перед числом. я пробовал пихать его везде, где только мог - ошибка не исчезает. ананасы, бля буду, я перешерстил весь гугл, но так и не нашел вообще никакой инфы по mov с использованием логических операторов | и &. еще и >> какой-то, вообще охуеть, по нему вообще ничего (ну не может гугл в поиск символов, увы). поясните за эту хуйню, если сами знаете, ну или ссылку, хотя б на буржуйском. с меня как обычно.
Мимокрокодил 13/08/15 Чтв 11:33:23 #2 №529361 
Анон, ты можешь в fgrep и найти значение CS_BASE?

Кароч, CS_BASE это начало сегмента кода и ты можешь просто посчитать правую константу в КАЛЬКУЛЯТОРЕ (или попробовать считать относительно сегмента ".text" как это в AT&T. Вот только может случиться хуита, если там количество байт у тебя где-то поменяется. Такие дела.
Аноним 13/08/15 Чтв 11:36:16 #3 №529364 
>>529361
да с хуя ли CS_BASE это начало сегмента кода, когда он определен с помощью equ?
алсо, сегментов а-ля .text в коде вообще нет, хуй знает как так.
Аноним 13/08/15 Чтв 11:37:10 #4 №529365 
>>529361
короче значение вычисляется как 0x1000-0x8097
Аноним 13/08/15 Чтв 11:39:13 #5 №529367 
>>529361
и как в калькуляторе считать |? это точно оператор ИЛИ или что-то другое?
Аноним 13/08/15 Чтв 11:49:53 #6 №529371 
>>529364
>>529365
>>529367
Ты саемперсон? Не важно впрочем, "|" это побитовое ИЛИ, инфа 99%

.text это метка в AT&T синтаксисе http://stackoverflow.com/questions/14544068/what-are-data-and-text-in-x86

Ты в коде значение CS_BASE искал?
Аноним 13/08/15 Чтв 12:00:36 #7 №529375 
>>529371
да, я ж писал - вычисляется из двух других переменных, объявляемых там же. 0x1000-0x8097 в итоге.
и да, это все три поста я. за ссыль спасибо.
Аноним 13/08/15 Чтв 12:05:09 #8 №529376 
и да, если | - ИЛИ, как оно считается в mov? совершенно не понимаю
Аноним 13/08/15 Чтв 12:07:47 #9 №529377 
>>529375
Антош, я посчитал, и получилась подозрительно красивая константа '0xffff'

бтв ты случаем с операционки на операционку не портируешь?
Аноним 13/08/15 Чтв 12:09:04 #10 №529378 
>>529376

Все константы асм считает при конпеляции же!

Я тут еще посеменю, попробуй эту штуку : https://code.google.com/p/ta2as/
Аноним 13/08/15 Чтв 12:11:59 #11 №529381 
>>529377
нет.
>>529378
ну посчитал он константы, как он между ними делает ИЛИ? я чего-то не понимаю, да?...
штуку попробую, сенкс, долго искал, так и не нашел.
Аноним 13/08/15 Чтв 12:18:21 #12 №529382 
>>529376

Смотри, берем простой код на Си :

margo@margaret tmp $ cat fail.c
int main()

{
int a = 0xde000000 + 0x00ad0000 + 0x0000beef;

return a;
}
При трансляции в асм получается такая штука :

margo@margaret tmp $ cc -S fail.c
margo@margaret tmp $ cat fail.s
.file "fail.c"
.text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
movl $-559038737, -4(%rbp)
movl -4(%rbp), %eax
popq %rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0:
.size main, .-main
.ident "GCC: (Gentoo 4.8.4 p1.4, pie-0.6.1) 4.8.4"
.section .note.GNU-stack,"",@progbits

Восхитительная отрицательная константа и есть то, что получиться должно
>>> hex(0x100000000-559038737)
'0xdeadbeef'
Аноним 13/08/15 Чтв 12:21:57 #13 №529384 
>>529382
а как это вообще с темой связано? яннп((
Аноним 13/08/15 Чтв 12:29:03 #14 №529385 
>>529384
Принцип один и тот же, у продвинутых ассемблеров есть метки, макросы, которых в исполняемых файлах и инструкциях процессора нет, ассемблер точно так же считает все величины, которые возможно вычислить на этапе компиляции.

Скажем, если у тебя CS_BASE был бы не через equ объявлен, а был бы например адресом переменной, чье значение ты хотел бы использовать, у тебя в один мув не получилось бы ничего сделать и нужно было бы использовать инструкции И/ИЛИ/сдвига.

Понимат?
Аноним 13/08/15 Чтв 12:33:00 #15 №529387 
>>529385
понимат. не понимат другого: у тебя в коде куча инструкций, начинающихся с точки. у меня ни одной. плохой код или что?
Аноним 13/08/15 Чтв 12:39:01 #16 №529389 
>>529387
С точки начинаются директивы ассемблера - разделение на секции, экспортируемые символы, всякая служебная информация, типа версии системы. Насколько я помню, с точки ни одной инструкции не начинается вообще. Если писать вручную, то большую часть директив можно пропустить, кроме разделения на секции и объявления символа main
Аноним 13/08/15 Чтв 12:43:22 #17 №529391 
>>529387
Пример вручную написанного кода :
.text
usage: .string "try to write : ./main test \n"
err_fork: .string "fork"
some_text: .string "%s qwertyuiop asdfghjkl zxcvbnm \n"
file_cat: .string "/bin/cat"
cat_arg0: .string "cat"
err_execv: .string "execv"
wait_text: .string "wait"

.globl main

.text
main:

# 0(%ebp) int ebp
# 4(%ebp) ret
# 8(%ebp) int argc
# 12(%ebp) char argv

pushl %ebp
movl %esp, %ebp

#check argc
cmp $2, 8(%ebp)
jge argc_ok


movl 12(%ebp), %ebx
pushl $usage
call printf
addl $8, %esp

#exit
jmp exit_fail

argc_ok:
#fork
call fork
testl %eax, %eax #sravnivaem eax s nulem, esli eax<0, to "-"
#esli eax = 0 to zero flag ustanovitsya
#Intel Optimization Manual

jns fork_success

#perror
pushl $err_fork
call perror #ob"yasnyet kodi oshibok
addl $4, %esp

jmp exit_fail

fork_success:
jnz parent

movl 8(%ebp), %eax
shl $4, %eax
pushl %eax
pushl 12(%ebp)
pushl %ebp
call memcpy
addl $12, %esp


#child process

#execv(file_cat, argv)
movl $cat_arg0, (%eax)

pushl %eax
pushl $file_cat
call execv #zamenyaet process programmoi iz file
#zamenyetsya cat
addl $8, %esp

#perror
pushl err_execv
call perror
addl $4, %esp

#exit
pushl $1
call exit

parent:
#parent process

pushl $0
call wait
addl $4, %esp

testl %eax, %eax
js wait_err

#roditel dolzhen vizvat printf(3) i raspechatat kakoi libo text
pushl $some_text
call printf
addl $4, %esp

#exit
pushl $0
call exit

wait_err:
pushl $wait_text
call perror
addl $4, %esp
pushl $1
call exit

exit_fail:
#exit
pushl $1
call exit
Аноним 13/08/15 Чтв 12:44:12 #18 №529394 
>>529391
Верстка съехала, вместо \t табы должны быть
Аноним 13/08/15 Чтв 12:45:14 #19 №529395 
>>529389
ну тогда вообще хреново, ибо я совсем хз как там чего объявлять, а никаких .main в коде нет.
Аноним 13/08/15 Чтв 12:48:21 #20 №529396 
>>529395
Посмотри этот пост:
>>529391
.globl main # Экспорт метки

.text
main: # Есть тонкость, если метка main:, то компилировать надо с gcc, если _main: то as/gas. Но инфа 60%, за лет 5 на асме ни строчки не было написано :3 Ах и да, прыщи, под виндой все немного по-другому.
Аноним 13/08/15 Чтв 12:55:28 #21 №529400 
>>529396
т.е. просто добавить .globl _main и .text в начало кода?
но почему as пытался без всего этого компилить и не ругался на это?
Аноним 13/08/15 Чтв 13:17:11 #22 №529406 
Тут мой ответ, в нем слово из спам-листа, но я не знаю какое. Файл. http://pastebin.com/zrNBQCr7
Аноним 13/08/15 Чтв 13:45:40 #23 №529420 
>>529406
аа, то есть оно само добавится в файл файл.о после ассемблирования командой as? ну збс.
Аноним 13/08/15 Чтв 13:50:04 #24 №529421 
>>529420
нет же, после ассемблирования у тебя объектный файл, его надо слинковать, а линковщик (ld) требует чтобы был объявлен символ main
Аноним 13/08/15 Чтв 13:50:48 #25 №529423 
>>529420
да и кстати ты можешь КУЧУ объектных файлов слинковать в один исполняемый
Аноним 13/08/15 Чтв 13:55:59 #26 №529426 
>>52942
аа, окей, значит, все же прописать в код в самом начале .globl _main .text?
Аноним 13/08/15 Чтв 14:55:53 #27 №529453 
>>529426
если фаел один - то да, если нет, то зависит от ситуации.

Ну и переменные не объявляй в .text ;)
Аноним 13/08/15 Чтв 15:55:33 #28 №529474 
>>529453
а в чем?
Аноним 13/08/15 Чтв 16:54:17 #29 №529528 
>>529474
в .data же

И все-таки рекомендую книгу посмотреть, она относительно короткая, хоть и на мунспике, но оче годная
Аноним 13/08/15 Чтв 16:55:10 #30 №529529 
>>529474
На стеке еще можно их объявлять (относительно ebp или esp)
Аноним 13/08/15 Чтв 17:12:59 #31 №529547 
>>529528
так, понял, сенкс
но все же, пока я не могу запустить ta2as, что не так с mov'ом?
Аноним 13/08/15 Чтв 17:15:30 #32 №529550 
например, насколько я понял из статей и примеров кода, в АТТ здесь
> [dword GDT_ADDRESS+DESCRIPTOR_ADDRESS+4]
+4 выносится за скобку, так?
Аноним 13/08/15 Чтв 17:27:26 #33 №529554 
Что, оп, хакирствуешь старые х86? Там же чуть ниже в презентации написан код в 8 строк (после препроцессора) который гораздо проще перепистать. Хотя я хз как ты с таким знанием асма собрался для своего руткита payload делать.
Аноним 13/08/15 Чтв 17:39:45 #34 №529562 
>>529554
как-как...плакать и делать...
Аноним 13/08/15 Чтв 17:47:47 #35 №529568 
>>529562
Ладно, это не самая сложная часть. Самая сложная - в нулевое кольцо сначала попасть. Никто не будет твои еба-модули ядра себе устанавливать.
Аноним 13/08/15 Чтв 19:34:16 #36 №529615 
>>529568
> нулевое кольцо
Господи, посмотрите на живого ньюфага! Не знает про технологию зацикленного нуля!
Аноним 13/08/15 Чтв 20:51:16 #37 №529646 
>>529615
>зацикленного нуля
Реквестирую соус!
HALP!!! Аноним 10/09/15 Чтв 12:05:39 #38 №541166 
14418759393010.jpg
АНОНЫ, ОЧЕНЬ СРОЧНО НУЖНО ПОНЯТЬ АССЕМБЛЕР С АЗОВ. ИНТЕРЕСНО НЕ ТОЛЬКО САМО ПРОГРАММИРОВАНИЕ, НО И УСТРОЙСТВО КОМПЬЮТЕРА. (НА ПАРАХ ПОСТОЯННО ГОВОРЯТ ПРО КАКИЕ ТО РЕГИСТРЫ, АККУМУЛЯТОРЫ, ПРОЧУЮ ХУЙНЮ, Я НИЧЕГО НЕ ПОНИМАЮ - ПАРЫ ПРОЕБАЛ) РЕКВЕСТИРУЮ УЧЕБНИКИ, ВИДЕО КУРСЫ, ВСЮ ПОЛЕЗНУЮ ИНФОРМАЦИЮ. ОЧЕНЬ НУЖНА ВАША ПОМОЩЬ!
Аноним 10/09/15 Чтв 13:54:41 #39 №541200 
14418824818710.jpg
>>541166
Аноним 11/09/15 Птн 13:53:39 #40 №541627 
>>541166
Начни с Таненбаума "архитектура компьютера", про Ассемблер в принципе куча книг тут например: http://habrahabr.ru/post/131971/ , сам сейчас читаю Ревича "Практическое программирование микроконтроллеров Atmel AVR на языке ассемблера", написано довольно живо и просто.
Аноним 11/09/15 Птн 17:11:56 #41 №541696 
>>541627
Я не советую вам в это углубляться, парни, я писал простенькие программы под AVR в эмуляторе, в тырпрайзе и web'е это вам не поможет, разве что выпендриться перед коллегами, для серьезного embedded это тоже днище. Танненбаума следует навернуть, да. Хорошая книга.
Аноним 11/09/15 Птн 19:45:10 #42 №541781 
>>541166
советую автора Магда - у него несколько книг. Из плюсов - то, что написано под винду. Из минусов - большие листинги и слабое использование макросов. Для начала, имхо, пойдет.
Аноним 11/09/15 Птн 20:07:00 #43 №541789 
>>529357 (OP)
Я тоже вижу подобную хуиту в первый раз и если я не ошибаюсь, это диррективы предпроцессора компилятора в сишном стиле, на что указывают логические операторы, в таком случае, всё что в круглых скобках становится лишним, и может быть вычислено во время компиляции в виде некоторого константного значения, не обязательно во всех случаях одинакового, которое уже используется непосредственно в программе.
Если не читать литературу по си я полагаю, ты не сможешь узнать значение | & >>
Аноним 11/09/15 Птн 20:23:42 #44 №541805 
>>541781
Открыл Магда, прочёл "Для того чтобы из объектного файла создать исполняемый файл, работающийв MS-DOS, следует выполнить командную строку link /со имя_файла.obj", удалил.
Аноним 11/09/15 Птн 21:24:48 #45 №541854 
>>541805
Ты не поверишь, но чтобы сделать исполняемый файл MS Windows, нужно сделать то же самое.
Аноним 12/09/15 Суб 01:47:43 #46 №541977 
>>541854
Пофиг, этот Магда уже зашкварился.
Аноним 12/09/15 Суб 01:52:46 #47 №541980 
>>541977
Он может быть на следующей странице ещё скажет вставить дискету с MASM, кто его знает.
Аноним 12/09/15 Суб 18:09:00 #48 №542142 
>>529357 (OP)
Помогите. Не могу разобраться с делением в FASM.
Вроде всё понятно - если делим eax на к примеру bl, то результат будет в ah и al, где остаток а где частное похуй, ща не об этом, почему

mov eax,[bid]
mov bx,260
div bx

или

mov eax,[bid]
mov bl,8
div bl

или даже

mov ax,word[bid]
mov bl,8
div bl

не выдают ошибку при компиляции, зато вешают моё недоприложение ошибкой выполнения?

В общем расскажите по жёсткому, как делить числа?
Аноним 12/09/15 Суб 18:35:19 #49 №542154 
>>542142
И ещё, что за хрень такая, что если значение помещается в слово, 258 например в регистр bx, мне нужно аккумулятор делить на регистр в двойное слово размером(ebx)?
Аноним 12/09/15 Суб 18:49:45 #50 №542163 
>>542142
Фасм тут не при чём. За ошибками компиляции тебе в хаскиль. Дели как написано в мануле и не выёбывайся.
Аноним 12/09/15 Суб 20:28:28 #51 №542207 
>>542163
Попизди мне тут про ошибки компиляции, очевидно же, что есть какое то неочевидное расхождение реальности с мануалом.
Аноним 13/09/15 Вск 20:44:51 #52 №542643 
14421662915070.jpg
>>529357 (OP)
Анон выручай есть пара вопросов не могу найти ответ
49. Как будет выглядеть машинный код, если в загрузочном коде биты настройки равны 010, двоичный код имеет вид 15 13 17, а начальный адрес равен 50? _______
50. Если машинный код равен 13 78 67, начальный адрес - 50, а двоичный код - 13 28 17, то как будут записаны биты настройки? ___________
Аноним 13/09/15 Вск 20:45:22 #53 №542645 
>>529357 (OP)
Анон выручай есть пара вопросов не могу найти ответ
49. Как будет выглядеть машинный код, если в загрузочном коде биты настройки равны 010, двоичный код имеет вид 15 13 17, а начальный адрес равен 50? _______
50. Если машинный код равен 13 78 67, начальный адрес - 50, а двоичный код - 13 28 17, то как будут записаны биты настройки? ___________
Аноним 14/09/15 Пнд 01:06:09 #54 №542758 
>>542645
Ты поехавший. Какие биты? Какая платформа? Какой ассемблер? Почему числа не в hex? Почему ты считаешь, что мы должны делать за тебя твою домашку?
Аноним 14/09/15 Пнд 06:09:48 #55 №542809 
>>542758
>Почему ты считаешь, что мы должны делать за тебя твою домашку?
1. Ты программистишка
2. Ты всё равно сидишь за компом и ничего не делаешь
3. Вместо того, чтобы тратить время на бессмысленные выебоны, ты мог бы уже давно решить мою домашку.
Аноним 14/09/15 Пнд 12:32:42 #56 №542891 
Есть OllyDbg и есть переменная в 4 байта в памяти. К этой переменной обращаются из нескольких мест, но Breakpoint on Memory Access останавливает ход на одной и той же инструкции или это какая-то процедура, что ее несколько раз вызывают. Можно как-то вывести список адресов и инструкций, что обращаются к этому куску памяти? Ну или хотя бы сделать так, чтоб отладчик не останавливал ход на помеченной инструкции, даже если она обращается к памяти?
Аноним 14/09/15 Пнд 15:21:00 #57 №542926 
>>542891
В двоечке есть Breakpoint->Memory log. В единичке, насколько я знаю, без плагинов не извернуться. Можешь ODBGScript взять, например. Или написать плагин сам.
Аноним 14/09/15 Пнд 15:46:47 #58 №542933 
>>542926
Спасибо.
Странно. Почему у меня Олли 1 и качая, я думал, что это последняя версия?
Аноним 14/09/15 Пнд 19:15:17 #59 №543047 
>>542933
Потому что OllyDbg 2 - то еще говно.
x64dbg попробуй еще не обращай внимание на название, он может и в 32-битный код. Стильно, модно, молодежно, скриптуется на питоне, но условных брейкпоинтов из коробки нет, лол.
Аноним 15/09/15 Втр 01:48:58 #60 №543208 
>>543047
Так я и не понял, как memory log пользоваться. x64dbg тоже, похоже, не может выводить адреса инструкций списком. Немного объясню свою проблему, может кто сталкивался:
Есть переменная и есть бесконечный цикл в программе. Несколько раз в этом цикле переменную читают для отрисовки и еще каких-то дел, несколько раз ее читают, чтобы изменить (не обязательно инкремент бай 1 - была 4, стала 0, например) при определенных условиях (ПКМ) и один раз читают, чтобы определить дальнейшие действия при других определенных условиях (ЛКМ).
Мне нужно найти вот это последнее последнее место, то есть как-то заставить отладчик не останавливаться на других инструкциях. inb4 замени все нопами
Может попробовать как-то поставить условие, типа если EIP == адресу инструкции, которую нужно пропустить, то не останавливаться? Но это все равно стремно, потому что нужно будет руками находить все такие места и прописывать условие
Аноним 15/09/15 Втр 02:09:51 #61 №543211 
>>543208
Кажется разобрался с memory log. Если использовать условия, то программа тормозит и как-будто не отвечает, а мне нужно, чтоб она плавненько шла, будто бы и отладчик не прицеплен.
Аноним 15/09/15 Втр 02:57:00 #62 №543226 
14422750207780.png
14422750207781.png
>>543211
> программа тормозит и как-будто не отвечает
Для Memory breakpoints отладчик убирает доступ со страницы памяти, содержащей нужный тебе адрес, ждет access violation, возвращает доступ, выполняет инструкцию, убирает доступ... это все тормозит, иначе никак.

Попробуй Breakpoint->Hardware log, хардварные точки останова гораздо быстрее. Настраиваешь как на пике (expression можно нормальный написать, с дополнительной инфой), потом в логе (Alt+L) видишь, кто обращался. Копируешь в текстовый редактор, удаляешь дублирующиеся строки, профит.
Аноним 15/09/15 Втр 04:06:26 #63 №543231 
14422791869870.png
>>543226
Во, теперь не тормозит, спасибо. Только почему-то программа останавливается, если открыто окно HWB (даже если брейкпойнт отключен).
Аноним 15/09/15 Втр 21:51:45 #64 №543572 
>>542891
Не пойму, чо тебе мешает пошагово двигаться по коду и увидеть инструкцию с адресом слева от неё, перед ошибкой? Ты же как то нашёл, что именно попытка доступа к переменной тебе ошибку выдаёт.
Аноним 15/09/15 Втр 22:42:51 #65 №543597 
>>543572
Насколько я понял, он пытается хакнуть клиент какой-то игры.
Аноним 16/09/15 Срд 01:22:58 #66 №543641 
Ананасы, подскажите годный учебник по ASM x86.
Аноним 16/09/15 Срд 01:41:34 #67 №543658 
>>543572
Да уже все. Если бы пошагово двигался, то не смог бы сделать так, чтобы необходимые условия выполнились ПКМ и нужная мне инструкция обратилась к памяти. Да там и кода столько, что я бы просто не смог вот таким путем.
Аноним 16/09/15 Срд 21:17:02 #68 №544085 
>>543641
у фасма в папочке годный мануал по х86.
Аноним 16/09/15 Срд 21:19:31 #69 №544086 
У меня ахуительные вопросы.
Что такое строковые операции в FASM, что за приколы с 'DS:ES'?
Как юзать FFPU?

Мануал читал, нихуя не понятно, точнее, как оказалось гуглопереводчик переводит не лучше меня.
Аноним 17/09/15 Чтв 01:19:16 #70 №544244 
>>544086
Перефразируй свои охуительные вопросы. Я не понял ни одного.
> строковые операции
lods movs stos - ты про эти? Что с ними не так?
lodsb = lods byte[ds:esi]
stosb = stos byte[es:edi]
movsb = movs byte[es:edi],byte[ds:esi]

> Как юзать FFPU?
FPU? Просто пиши инструкции.
Аноним 17/09/15 Чтв 07:59:57 #71 №544302 
>>544244
> ты про эти? Что с ними не так?
Эти, с ними всё хорошо, но я не пойму ни как что такое ds:esi, что значит это двоеточие и что строковые операции делают с ними.
В мануале пишется, что после строковой операции в зависимости от флага позиция инкрементируется или декрементируется - какая позиция? где? что перемещает movs?

>FPU? Просто пиши инструкции.
Тут тоже есть немножко проблема с пониманием, поскольку в мануале то десятичные инструкции то FPUшные перемежаются.
Аноним 17/09/15 Чтв 10:40:08 #72 №544335 
>>544302
> какая позиция? где? что перемещает movs

> The string operations operate on one element of a string. A string element may be a
> byte, a word, or a double word. The string elements are addressed by si and di (or esi
> and edi) registers.
> (мануал, который ты читаешь)

Все эти инструкции работают с 8/16/32-битными значениями (можно писать краткую форму с суффиксом b/w/d: lodsb/lodsw/lodsd или полную форму lods byte[ds:esi]) и неявно используют регистры ESI, EDI или оба. В ESI/EDI лежат, соответственно, исходный адрес и адрес назначения (eSi: S = source, eDi: D = destination). Все эти инструкции читают/пишут что-то по адресам из ESI или EDI (в зависимости от инструкции). Все они затем прибавляют или вычитают (в зависимости от DF) к используемому регистру (ESI, EDI или к обоим, если используются оба) 1, 2 или 4 байта (в зависимости от размера значения). Т.е., делают что-то по адресу, содержащемуся в регистре, а после выполнения инструкции готовы повторить то же самое для следующего элемента. Это удобно использовать для работы со строками посимвольно, поэтому инструкции называются строковыми (но никто тебе не запрещает считать сумму элементов массива с помощью той же lodsd, например).

lods читает в AL/AX/EAX значение по адресу, хранящемуся в ESI. stos записывает AL/AX/EAX по адресу из EDI, а MOVS объединяет обе инструкции: не затрагивая EAX, берёт по адресу из ESI, кладёт по адресу из EDI, ну и тоже изменяет ESI/EDI, конечно. scas берет значение по адресу EDI (!!!), сравнивает (по сути cmp) с AL/AX/EAX, ставит флаги соответственно. cmps делает практически то же, но сравнивает значение по адресу из ESI со значением по адресу из EDI, ставит флаги (и опять же модифицирует ESI и EDI после).

Сами по себе эти инструкции менее полезны, чаще используются в каком-нибудь цикле для операций со строками:
mov ecx,string_size
mov esi,string1
mov edi,string2
rep movsb ; Копируем из string1 в string2 string_size байтов.

Ну и насчет DS/ES (есть еще CS/SS/FS/GS): это сегментные регистры. Используются процессором для вычисления и проверки линейного адреса. Явно или неявно используются каждый раз, когда инструкция обращается к памяти. Какой конкретно сегментный регистр будет использоваться, определяется самой инструкцией и/или (для register indirect access) регистром, через который происходит обращение (для [esi] по умолчанию используется DS, для [edi] - ES, поэтому lods word[ds:esi] то же самое, то lods word[esi]). В современных ОС, работающих в защищенном режиме чаще всего DS = ES = SS (могут быть не равны, но, скажем так, эквивалентны), что позволяет тебе забыть о том, где какой сегментный регистр используется, и даже о том, что они вообще существуют, а беспокоиться только о виртуальном адресе (т.е., о том, что чаще всего просто адресом называют). Если же ты собираешься писать под какой-нибудь DOS, то с сегментацией придётся разобраться.

Про FPU читай что-нибудь типа http://www.website.masmforum.com/tutorials/fptute/ только не забывай, что в фасме st(0) пишется как st0, ну и просто в мануал поглядывай параллельно.
[МИМО ДИВАННЫЙ НЕЙРОЛУХ] Аноним 17/09/15 Чтв 16:50:15 #73 №544525 
>>544335
Ага, пасиба, теперь понятнее.
Значит
[code]
proc memcpy uses eax esi edi,srcp,dstp,size
mov ecx,0
mov esi,[srcp]
mov edi,[dstp]
@@:
mov al,byte[esi + ecx]
mov byte[edi + ecx], al
inc ecx
cmp ecx,[size]
jne @b
ret
endp
[/code]
эквивалентно по сути
[code]
proc memcpy uses eax esi edi,srcp,dstp,size
mov ecx,[size]
mov esi,[srcp]
mov edi,[dstp]
repnz movs [si],[di]
ret
endp
[/code]
так?
Аноним 17/09/15 Чтв 18:11:50 #74 №544560 
>>544525
> repnz movs [si],[di]
Во-первых, раз movsb никак не модифицирует флаги, да и не нужно тебе это, то ты должен сказать rep, а не repnz. Оно работает и так точнее не работает - не проверяет флаги из-за магии набора инструкций, но лучше так не делать.

Во-вторых, это не скомпилируется. si и di - это 16-битные регистры (младшие 16 бит esi и edi). То есть адресовать ты ими можешь только первые 64к памяти. В 32-битной системе movs будет использовать esi и edi. Еще ты перепутал порядок. У нас в Intel инструкции делают op dest, src (в данном случае movs [edi],[esi]). А еще ты не указал размер. Пиши либо movsb, либо movs byte[edi],[esi].

И заодно, uses eax ты можешь не писать. По конвенциям stdcall/cdecl 32-битные функции обязаны сохранять только ebx/esi/edi/ebp и df, а eax/ecx/edx можно портить, никто не обидится. Ты можешь городить свои конвенции вызовов, в том числе решить, что eax тоже стоит сохранять, но это повлияет и на скорость, и на размер кода.
Аноним 17/09/15 Чтв 19:33:09 #75 №544636 
>>544560

Ну я понял, ошибки учёл.

Значит:

proc memcpy uses esi edi,srcp,dstp,size
mov ecx,[size]
mov esi,[srcp]
mov edi,[dstp]
rep movsb
ret
endp

И дело в шляпе?

А если жахнуть:

proc memcpy uses esi edi,srcp,dstp,size
mov ecx,[size]
mov esi,[srcp]
mov edi,[dstp]
rep movsd
ret
endp

Оно будет по 4 байта копировать, ошибок аля выход за пределы массива не будет и операндов не потребует?
Аноним 17/09/15 Чтв 19:36:13 #76 №544638 
>>544636
Вкурил ответ на свой вопрос.
Ссылка на перевод мануала
http://flatassembler.narod.ru/fasm.htm
Аноним 17/09/15 Чтв 19:42:48 #77 №544644 
>>544636
> А если жахнуть
То тебе придется разделить size на 4 (иначе ты скопируешь size * 4 байтов со всеми вытекающими последствиями), а также случаи, когда size на 4 нихуя не делится (т.е., остаются байты, которых мало на dword, но копировать их все равно нужно).

[code]
...
mov ecx,[size]
and ecx,3
...
rep movsb

mov ecx,[size]
shr ecx,2
...
rep movsd
[/code]
Аноним 17/09/15 Чтв 19:44:46 #78 №544646 
>>544644
>То тебе придется разделить size на 4
Я так и знал.
Аноним 17/09/15 Чтв 20:53:14 #79 №544706 
14425123946430.png
>>529357 (OP)
Аноним 17/09/15 Чтв 21:28:36 #80 №544728 
14425145166650.png
>>544706
Пофиксил тебя, не благодари.
Аноним 17/09/15 Чтв 21:54:45 #81 №544743 
>>544728
ПХПшник?
Аноним 17/09/15 Чтв 21:55:46 #82 №544744 
>>544743
Почему вдруг?
Аноним 18/09/15 Птн 06:58:40 #83 №544888 
>>544644
У тебя порядок неправильный. Если есть лишние байты, то первым циклом ты выйдешь на середину слова, и второй будет копировать половину байтов из первого, а половину из второго. Тормоза, гроб, смерть.
Аноним 18/09/15 Птн 07:59:54 #84 №544899 
>>544744
По тому что из твоей жопы хвост торчит двухметровый, обезьяна.
Аноним 20/09/15 Вск 02:39:17 #85 №546136 
>>544888
Там по-хорошему должны быть с двух сторон movsb (сначала копируем до границы адреса, выровненного на дворд, потом копируем двордами, потом копируем остатки), но анон только узнал про эти movsb, зачем усложнять-то?
Аноним 23/09/15 Срд 23:44:21 #86 №548146 
>>529357 (OP)
Жаль что утонул, щас подниму. Асемблер кун помоги в универе дали вот это http://rghost.ru/8gZcTfm88 сказали там есть пример запустишь посмотришь. Так вот это говно под 8 не завелось скачал хр на виртуалку, exe запустилось че делать не понимаю, фаилы asm не поддаются запуску. Помогай АНОН
Аноним 24/09/15 Чтв 00:16:29 #87 №548162 
>>548146
Батник запускай. И посмотри, что в нем: там сначала компилируется программа, потом линкуется, потом запускается под отладчиком. Алсо, DOSBox, и не нужна XP.
Аноним 24/09/15 Чтв 04:22:28 #88 №548207 
>>529382
Интересно чому компилятор просто не засунул константу сразу в eax? Или это без оптимизаций?
Аноним 24/09/15 Чтв 13:52:00 #89 №548273 
>>548207
Это без оптимизаций, для упрощения отладки, и это гцц.
Аноним 27/09/15 Вск 12:54:55 #90 №549669 
>>541980
проиграл
comments powered by Disqus

Отзывы и предложения