argon bulletin board
Факултети => Факултет по математика и информатика => Темата е започната от: Jack Johnson в 20.10.2006, 17:37:49
-
Ето един интересен проблем, свързан с асемблер:
Intel x86 Code
mov AX, 0xABCD
push AX
pop AL
Пита се каква е стойността, записана в регистъра AL след изпълнението на този код. Дали е 0xAB, или е 0xCD? Дали отговорът ще важи и за AMD базирани процесори? Macintosh? Друг вид процесори?
-
hahaha interesen vapros az bih zalojil na 0xCD stack pointer namalen samo s 1 (toest 0xAB shte ostane na stacka)
niakoi da go probva i da mi kaje che niamam asm instaliran
inache sam siguren che vsichki x86 procesori shte se darjat po edin i sasht nachin
tova zavisi ot tova kak se redi stacka a ne viarvam da ima razlika v tova na razlichnite arhitekturi
-
Dopalnitelno izsledvane pokaza che e nevuzmojno da se premesti stack pointer s 1 byte toest da se napravi push/pop operacia na 1 byte
izliza che tochno v toia sluchai kakto si pushvash AX taka shte si go popnesh celia AX nishto che pishesh pop AL
tozi primer smiatam che e ekvivalenten na vaprosa
push 0xABCDEF12
pop AX
pop BX //za da balansirame stacka
pri nego AX stava 0xEF12
ABCD ostava na stacka i pri pop otiva v BX
tova se potvardi i s experimenti VS2005 C++ Express Edition
btw dosta veroiatno e pop AL da ne moje da se compile-ne s drug assembler
-
Мисля си, дали OpenBSD всъщност не пита и нещо относно в какъв ред се записват байтовете в паметта, младши-старши или старши-младши.
В Intel x86 и пряко съвместимите с нея архитектури редът е младши-старши ( little-endian ), докато и двете процесорни семейства на Macintosh - 680x0 и PowerPC - пишат в ред старши-младши ( big-endian ).