Size: a a a

2020 April 21

R

Rabu in pro.asm
Искандер Искаков
[NASM x64]

global  _ft_strcmp
;int strcmp(const char *s1, const char *s2);
_ft_strcmp:
 rep  cmpsb   ; сравниваю rdi и rsi
 jne ret_ne     ; если последние сравненные символы не равны - jmp
 xor rax, rax   ; если равны - обнуляю rax, чтобы вернуть 0
 ret

ret_ne:
 jbe lower      
 ja higher    

lower:
 mov rax, -1
 ret

higher:
 mov rax, 1
 ret

Ребят, подскажите пожалуйста в чем загвоздка.
После выполнения rep cmpsb исполнение всегда уходит в jne. Даже в случае если строки были равные - не проскакивает.
Понимаю что очень наивный код, но сижу и ломаю голову почему он не работает. Есть мысль что стоп кондишн у rep такой, что исполняя эту инструкцию вообще невозможно узнать что строки были равны... Туплю
конвенция вызова кладет не в те регистры
источник

ИИ

Искандер Искаков in pro.asm
Rabu
конвенция вызова кладет не в те регистры
Текущее состояние вот такое:

global  _ft_strcmp
 ; char *strcpy(char * dst, const char * src);
_ft_strcmp:
 extern _ft_strlen
 call _ft_strlen
 mov rcx, rbx

 rep  cmpsb
 jne ret_ne
 xor rax, rax
 ret

ret_ne:
 jbe lower
 ja higher

lower:
 mov rax, -1
 ret

higher:
 mov rax, 1
 ret
источник

ИИ

Искандер Искаков in pro.asm
Rabu
конвенция вызова кладет не в те регистры
А можно поподробнее, плз, в каком моменте это происходит? Спасибо!
источник

R

Rabu in pro.asm
Искандер Искаков
А можно поподробнее, плз, в каком моменте это происходит? Спасибо!
если вызываешь из си
источник

ИИ

Искандер Искаков in pro.asm
блин, я дубина... т.е. нужно в rBx ложить численное значение, а rax это exit code?
источник

ИИ

Искандер Искаков in pro.asm
вызываю из си
источник

R

Rabu in pro.asm
нет, оно ложит параметры по порядку, но первые 2 регистра rdi и rsi только в 64-битном коде
источник

R

Rabu in pro.asm
в rcx можно просто ложить -1
источник

R

Rabu in pro.asm
repe вместо rep
источник

ИИ

Искандер Искаков in pro.asm
Rabu
нет, оно ложит параметры по порядку, но первые 2 регистра rdi и rsi только в 64-битном коде
global  _ft_strcmp
 ; char *strcpy(char * dst, const char * src);
_ft_strcmp:
 mov rcx, -1

 repe  cmpsb
 jne ret_ne
 xor rax, rax
 ret

ret_ne:
 jbe lower
 ja higher

lower:
 mov rax, -1
 ret

higher:
 mov rax, 1
 ret
источник

ИИ

Искандер Искаков in pro.asm
Аутпут (не работает):

strcmp("abcd", "abCd") = -1
strcmp("abCd", "abcd") = 1
strcmp("abcd", "abcd") = 1

Ааааа я тупой........
источник

ЕК

Евгений Красников (Jin X) in pro.asm
Rabu
в rcx можно просто ложить -1
Я бы не стал. Если строки одинаковые, пойдет дальше, вплоть до защищенных областей нравится.
источник
2020 April 23

AC

Amber Claes in pro.asm
Сделал 3 файла, bar.asm, kitchen.asm и bakery.asm.
По очереди каждый собираю в .о, далее делаю такую линковку
gcc -o bakery bakery.o bar.o kitchen.o -no-pie
main функция находится в bakery, но по непонятным мне причинам они не могут определится с bar.asm у кого функция главнее и вызываются сразу оба.
Т.е. сначала идёт main, потом идёт функция из бара, но с kitchen такой проблемы нет.
Как мне определить main как главную?
источник

AC

Amber Claes in pro.asm
источник

A

Aiwan ╭∩╮ (òÓ,) ╭∩╮ in pro.asm
а при линковке разве нельзя определить точку входа?
источник

AC

Amber Claes in pro.asm
Aiwan ╭∩╮ (òÓ,) ╭∩╮
а при линковке разве нельзя определить точку входа?
Попробовал это
gcc -o bakery bakery.o bar.o kitchen.o -no-pie -Wl,--entry=main
Теперь выдаёт segmentation fault
источник

AC

Amber Claes in pro.asm
И всё равно этот чай проскакивает
источник

s

s54816 in pro.asm
Тут два файла. Где третий?
источник

AC

Amber Claes in pro.asm
s54816
Тут два файла. Где третий?
В третем проблем нет
источник

AC

Amber Claes in pro.asm
Проблема что после greeting откуда-то берётся make_tea
источник