Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

Как перенести параметры из ф-ции printf() в самодельную - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Распечатать список учеников музыкальной школы, которые учатся играть на скрипке http://www.cyberforum.ru/cpp-beginners/thread312657.html
Распечатать список учеников музыкальной школы, которые учатся играть на скрипке. Указать также, сколько лет они занимаются музыкой и принимали ли участие в каких-либо конкурсах.
C++ Две задачи СТЕК в динамической памяти Здраствуйте уважаемые программисты помогите пожалуйста решить две задачи: 1.Дан файл содержащий текст на русском языке. Файл считывается в СТЕК в динамической памяти. Найти и вывести в другой файл... http://www.cyberforum.ru/cpp-beginners/thread312651.html
C++ 0xчисло
0x - это десятичная система исчисления? И как это называется, когда пишут int a = 0x5? Как правильно это(0x) называется? Какие выглядят другие системы исчисления?
как из вектора удалить отрицательные числа C++
Создать вектор, заполнить его случайными целыми числами в интервале от -10 до 10. Вывести в ListBox. Затем удалить из него все отрицательные элементы и вывести еще раз вектор в ListBox. moja...
C++ строки. что-то тут не так http://www.cyberforum.ru/cpp-beginners/thread312607.html
вот код //Программа удаления из строки символов '0..9' #include<iostream> // заголовыочный файл с описаниями функций ввод\вывод #include<conio.h> // заголовочный файл для создания текстового...
C++ Оператор " :: " (Двойное двоеточие) Доброй ночи! Расскажите пожалуйста что нибудь про этот оператор, и чем он отличается от других операторов подобного предназначения, то есть, в чем его особенность. Заранее благодарен.=) подробнее

Показать сообщение отдельно
Evg
Эксперт CАвтор FAQ
18030 / 6262 / 427
Регистрация: 30.03.2009
Сообщений: 17,207
Записей в блоге: 27
29.05.2013, 15:49
Цитата Сообщение от Kastaneda Посмотреть сообщение
Это понятно, но вот в случае с передачей аргументов на стеке непонятно, при чем тут режим процессора, если стек одинаково работает в любых режимах (ну допустим) ?
Передача параметров обычно описывается через слоты. Т.е. описывается положение слотов на регистрах/памяти, а далее описывается, как значения укладываются в слоты. По тем машинам, программные соглашения которых мне доводилось читать, размер слота может быть либо 4, либо 8 байт (как правило, в зависимости от размера аппаратного регистра).

Если копнуть дальше, то есть ещё тонкости. На SPARC в режиме 64 размер слота равен 8 байт. Если мы передаём параметр типа int, то он кладётся в младшую часть слота (left justify), а если передаём структуру, состоящую из одного int'а - то в старшую часть слота (right justify). Может быть, я перепутал лево и право (на память не помню), но не суть. Смысл в том, что параметр одного и того же размера на одной и той же позиции (типа 7-й по счёту параметр) может оказаться в разных местах стека

Добавлено через 2 минуты
Цитата Сообщение от Kastaneda Посмотреть сообщение
Ок, почему тогда сейчас (в х86_64) мы имеем 2 правила передачи параметров - для Windows и System V? и отличаются они лишь используемыми регистрами и организацией стека. Тут совсем не понятно, это ж просто разные ОС для одного режима одного процессора. Получается ноги растут из компиляторов?
На вопрос "почему" я ответить не могу - это надо спрашивать у тех, кто это придумал. Я здесь говорю лишь о том, что программные соглашения НЕ являются частью языка программирования. Кто конкретно их придумывает (разработчики железа или софта) я тоже однозначно ответить не могу. Скорее всего, это как-то решается в комплексе совместными усилиями. В современном мире всё-таки разработка аппаратуры ведётся опираясь на возможности компилятора

Добавлено через 17 часов 49 минут
Цитата Сообщение от Kastaneda Посмотреть сообщение
но вот в случае с передачей аргументов на стеке непонятно, при чем тут режим процессора, если стек одинаково работает в любых режимах (ну допустим) ?
Для наглядной демонстрации этого момента немного перепишем пример: добавим 8 фиктивных параметров, которые заполнят всю регистровую часть и интересующие нас параметры будут все в стеке. По полученным результатам хорошо видны те слоты, о которых я писал выше

C
#include <stdio.h>
 
void func (int fake0, int fake1, int fake2, int fake3,
           int fake4, int fake5, int fake6, int fake7,
           int x1, ...)
{
  int x2, x3, x4;
  int *p = &x1;
 
  x2 = *(p + 1);
  x3 = *(p + 2);
  x4 = *(p + 3);
 
  printf ("x1 = %x\n", x1);
  printf ("x2 = %x\n", x2);
  printf ("x3 = %x\n", x3);
  printf ("x4 = %x\n", x4);
}
 
int main (void)
{
  func (0, 0, 0, 0, 0, 0, 0, 0,
        0x11111111, 0x22222222, 0x33333333, 0x44444444);
  return 0;
}
Код
Intel Linux, 32-битный режим
x1 = 11111111
x2 = 22222222
x3 = 33333333
x4 = 44444444
Код
Intel Linux, 64-битный режим
x1 = 11111111
x2 = 0
x3 = 22222222
x4 = 0
Код
SPARC Linux, 32-битный режим
x1 = 11111111
x2 = 22222222
x3 = 33333333
x4 = 44444444
Код
SPARC Linux, 64-битный режим
x1 = 11111111
x2 = 0
x3 = 22222222
x4 = 0
3
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru