Чета книгата "Компютърни системи: гледна точка на програмиста". Точно сега не съм много сигурен, че разбирам кога да използвам различните инструкции за mov. Ето го упражнението:
Практически проблем 3.4
Да приемем, че променливите v и p са декларирани с типове
src_t v;
dest_t *p;
където src_t и dest_t са типове данни, декларирани с typedef. Искаме да използваме подходящата инструкция за движение на данни, за да изпълним операцията
*p = (dest_t) v;
където v се съхранява в подходящо наречената част на регистър %eax (т.е. %eax, %ax или %al), докато указателят p се съхранява в регистър %edx.
За следните комбинации от src_t и dest_t напишете ред асемблерен код, който извършва подходящото прехвърляне. Спомнете си, че когато извършвате преобразуване, което включва както промяна на размера, така и промяна на „подпис“ в C, операцията трябва първо да промени подписа (раздел 2.2.6).
Проверявам решенията си спрямо тази публикация в блога и не съм съвсем сигурен, че разбирам проблем 3:
src_t dest_t My Solution Blog's Solution
char unsigned movzbl %al, (%edx) movsbl %al, (%edx)
Номер 3: Аз използвам movzbl, докато авторът на блога използва movsbl. Не разбирам мотивите на movzbl срещу movsbl в този случай... Ако символът е отрицателен, така или иначе ще се окажете с грешно число, може ли някой да изясни защо movsbl е правилният избор тук?
char
е със знак или без знак. Това е дефинирано от изпълнението, така че и двете решения са еднакво правилни, като се има предвид съответстващото изпълнение. - person Jester   schedule 08.04.2015char
е подписано в този случай, други проблеми иматunsigned char
, така че мисля, че липсата му означава, че този е подписан. - person Augusto Dias Noronha   schedule 08.04.2015char
е подписано, трябва да използватеmovsbl
, за да го разширите. Например, ако вашата стойност на char е-1
, вие искате стойносттаunsigned int
да бъде0xffffffff
(това се изисква от стандарта C). - person Jester   schedule 08.04.2015