LINUX.ORG.RU

История изменений

Исправление SZT, (текущая версия) :

И еще по поводу стека

static inline uint32_t stack_push_str(uint32_t *stack, const char *str) {
	*stack -= strlen(str) + 1;
	memcpy((void *) (*stack), str, strlen(str) + 1);
	return *stack;
}

static inline uint32_t stack_push_int(uint32_t *stack, uint32_t val) {
	*stack -= 4;
	memcpy((void *)(*stack), &val, 4);
	return *stack;
}
Все та же проблема со стеком - например в MIPS нет явных инструкций типа push/pop и их реализуют через инструкции типа load/store с адресацией относительно какого-то регистра, т.е. направление роста стека там зависит от ABI

Функция stack_push_str может записать строку произвольной длинны т.е. значение stack может быть не кратно 4 байтам - нехоршо.

Да и вызов функции memcpy несколько настораживает, я б использовал что-то типа __builtin_memcpy хотя вы наверно не только совместимые с GNU __builtin компиляторы поддерживаете.

Исходная версия SZT, :

И еще по поводу стека

static inline uint32_t stack_push_str(uint32_t *stack, const char *str) {
	*stack -= strlen(str) + 1;
	memcpy((void *) (*stack), str, strlen(str) + 1);
	return *stack;
}

static inline uint32_t stack_push_int(uint32_t *stack, uint32_t val) {
	*stack -= 4;
	memcpy((void *)(*stack), &val, 4);
	return *stack;
}
Все та же проблема со стеком - например в MIPS нет явных инструкций типа push/pop и их реализуют через инструкции типа load/store с адресацией относительно какого-то регистра, т.е. направление роста стека там зависит от ABI

Функция stack_push_str может записать строку произвольной длинны т.е. значение stack будет не кратно 4 байтам - нехоршо.

Да и вызов функции memcpy несколько настораживает, я б использовал что-то типа __builtin_memcpy хотя вы наверно не только совместимые с GNU __builtin компиляторы поддерживаете.