4501

Команды пересылки данных на языке ассемблер

Лекция

Информатика, кибернетика и программирование

Команды пересылки данных на языке ассемблер Для удобства практического применения и отражения их специфики команды данной группы удобнее рассматривать в соответствии с их функциональным назначением, согласно которому их можно разбить на следующие гр...

Русский

2012-11-21

57.22 KB

101 чел.

Команды пересылки данных на языке ассемблер

Для удобства практического применения и отражения их специфики команды данной группы удобнее рассматривать в соответствии с их функциональным назначением, согласно которому их можно разбить на следующие группы команд:

  1.  пересылки данных общего назначения
  2.  ввода-вывода в порт
  3.  работы с адресами и указателями
  4.  преобразования данных
  5.  работы со стеком

Команды пересылки данных общего назначения

К этой группе относятся следующие команды:

mov <операнд назначения>,<операнд-источник> 

xchg <операнд1>,<операнд2> 

mov - это основная команда пересылки данных. Она реализует самые разнообразные варианты пересылки.

Отметим особенности применения этой команды:

  1.  командой mov нельзя осуществить пересылку из одной области памяти в другую. Если такая необходимость возникает, то нужно использовать в качестве промежуточного буфера любой доступный в данный момент регистр общего назначения.
  2.  К примеру, рассмотрим фрагмент программы для пересылки байта из ячейки fls в ячейку fld:

 

masm

model   small

.data

fls     db      5

fld     db      ?

.code

start:

...

        mov     al,fls

        mov     fld,al

        ...

end     start

  1.  нельзя загрузить в сегментный регистр значение непосредственно из памяти. Поэтому для выполнения такой загрузки нужно использовать промежуточный объект. Это может быть регистр общего назначения или стек. Если вы посмотрите листинги 3.1 и 5.1, то увидите в начале сегмента кода две команды mov, выполняющие настройку сегментного регистра ds. При этом из-за невозможности загрузить впрямую в сегментный регистр значение адреса сегмента, содержащееся в предопределенной переменной @data, приходится использовать регистр общего назначения ax;
  2.  нельзя переслать содержимое одного сегментного регистра в другой сегментный регистр. Это объясняется тем, что в системе команд нет соответствующего кода операции. Но необходимость в таком действии часто возникает. Выполнить такую пересылку можно, используя в качестве промежуточных все те же регистры общего назначения. Вот пример инициализации регистра es значением из регистра ds:

 

        mov     ax,ds

        mov     es,ax

  1.  Но есть и другой, более красивый способ выполнения данной операции — использование стека и команд push и pop:

 

        push    ds      ;поместить значение регистра ds в стек

        pop     es      ;записать в es число из стека

  1.  нельзя использовать сегментный регистр cs в качестве операнда назначения. Причина здесь простая. Дело в том, что в архитектуре микропроцессора пара cs:ip всегда содержит адрес команды, которая должна выполняться следующей. Изменение командой mov содержимого регистра cs фактически означало бы операцию перехода, а не пересылки, что недопустимо.

Для двунаправленной пересылки данных применяют команду xchg. Для этой операции можно, конечно, применить последовательность из нескольких команд mov, но из-за того, что операция обмена используется довольно часто, разработчики системы команд микропроцессора посчитали нужным ввести отдельную команду обмена xchg. Естественно, что операнды должны иметь один тип. Не допускается (как и для всех команд ассемблера) обменивать между собой содержимое двух ячеек памяти. К примеру,

 

        xchg    ax,bx   ;обменять содержимое регистров ax и bx

        xchg    ax,word ptr [si]        ;обменять содержимое регистра ax

                ;и слова в памяти по адресу в [si]

Команды ввода-вывода в порт

На уроке 6 при обсуждении вопроса о том, где могут находиться операнды машинной команды, мы упоминали порт ввода- вывода.

Посмотрите на рис. 1. На нем показана сильно упрощенная, концептуальная схема управления оборудованием компьютера.

Рис. 1. Концептуальная схема управления оборудованием компьютера

Как видно из рис. 1, самым нижним уровнем является уровень BIOS, на котором работа с оборудованием ведется напрямую через порты. Тем самым реализуется концепция независимости от оборудования. При замене оборудования необходимо будет лишь подправить соответствующие функции BIOS, переориентировав их на новые адреса и логику работы портов.

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

in аккумулятор,номер_порта — ввод в аккумулятор из порта с номером номер_порта;

out порт,аккумулятор — вывод содержимого аккумулятора в порт с номером номер_порта. 

Команды работы с адресами и указателями памяти

При написании программ на ассемблере производится интенсивная работа с адресами операндов, находящимися в памяти. Для поддержки такого рода операций есть специальная группа команд, в которую входят следующие команды:

lea назначение,источник — загрузка эффективного адреса;

lds назначение,источник — загрузка указателя в регистр сегмента данных ds;

les назначение,источник — загрузка указателя в регистр дополнительного сегмента данных es;

lgs назначение,источник — загрузка указателя в регистр дополнительного сегмента данных gs;

lfs назначение,источник — загрузка указателя в регистр дополнительного сегмента данных fs;

lss назначение,источник — загрузка указателя в регистр сегмента стека ss.

Команда lea похожа на команду mov тем, что она также производит пересылку. Однако, обратите внимание, команда lea производит пересылку не данных, а эффективного адреса данных (то есть смещения данных относительно начала сегмента данных) в регистр, указанный операндом назначение.

Часто для выполнения некоторых действий в программе недостаточно знать значение одного лишь эффективного адреса данных, а необходимо иметь полный указатель на данные. Вы помните, что полный указатель на данные состоит из сегментной составляющей и смещения.

Все остальные команды этой группы позволяют получить в паре регистров такой полный указатель на операнд в памяти. При этом имя сегментного регистра, в который помещается сегментная составляющая адреса, определяется кодом операции. Соответственно, смещение помещается в регистр общего назначения, указанный операндом назначение.

Но не все так просто с операндом источник. На самом деле, в команде в качестве источника нельзя указывать непосредственно имя операнда в памяти, на который мы бы хотели получить указатель.

Предварительно необходимо получить само значение полного указателя в некоторой области памяти и указать в команде получения полного адреса имя этой области. Для выполнения этого действия необходимо вспомнить директивы резервирования и инициализации памяти.

При применении этих директив возможен частный случай, когда в поле операндов указывается имя другой директивы определения данных (фактически, имя переменной). В этом случае в памяти формируется адрес этой переменной. Какой адрес будет сформирован (эффективный или полный), зависит от применяемой директивы. Если это dw, то в памяти формируется только 16-битное значение эффективного адреса, если же dd — в память записывается полный адрес. Размещение этого адреса в памяти следующее: в младшем слове находится смещение, в старшем — 16-битная сегментная составляющая адреса.

Например, при организации работы с цепочкой символов удобно поместить ее начальный адрес в некоторый регистр и далее в цикле модифицировать это значение для последовательного доступа к элементам цепочки. В листинге 1 производится копирование строки байт str_1 в строку байт str_2.

В строках 12 и 13 в регистры si и di загружаются значения эффективных адресов переменных str_1 и str_2.

В строках 16 и 17 производится пересылка очередного байта из одной строки в другую. Указатели на позиции байтов в строках определяются содержимым регистров si и di. Для пересылки очередного байта необходимо увеличить на единицу регистры si и di, что и делается командами сложения inc (строки 18, 19). После этого программу необходимо зациклить до обработки всех символов строки. 

 

Листинг 1. Копирование строки

<1>;---------Prg_7_2.asm---------------

<2>     masm

<3>     model   small

<4>     .data

<5>     ...

<6>     str_1 db        ‘Ассемблер — базовый язык компьютера’

<7>     str_2   db      50 dup (‘ ‘)

<8>     full_pnt        dd str_1

<9>     ...

<10>    .code

<11>    start:

<12>    ...

<13>    lea     si,str_1

<14>    lea     di,str_2

<15>    les     bx,full_pnt     ;полный указатель на str1 в пару es:bx

<16>    m1:

<17>    mov     al,[si]

<18>    mov     [di],al

<19>    inc     si

<20>    inc     di

<21> ;цикл на метку m1 до пересылки всех символов

<22> ...

<23>    end     start

Необходимость использования команд получения полного указателя данных в памяти, то есть адреса сегмента и значения смещения внутри сегмента, возникает, в частности, при работе с цепочками.

В строке 14 листинга 1 в двойном слове full_pnt формируются сегментная часть адреса и смещение для переменной str_1. При этом 2 байта смещения занимают младшее слово full_pnt, а значение сегментной составляющей адреса — старшее слово full_pnt. В строке 14 командой les эти компоненты адреса помещаются в регистры bx и es. 

Команды преобразования данных

К этой группе можно отнести множество команд микропроцессора, но большинство из них имеют те или иные особенности, которые требуют отнести их к другим функциональным группам.

Поэтому из всей совокупности команд микропроцессора непосредственно к командам преобразования данных можно отнести только одну команду:

xlat [адрес_таблицы_перекодировки] 

Это очень интересная и полезная команда. Ее действие заключается в том, что она замещает значение в регистре al другим байтом из таблицы в памяти, расположенной по адресу, указанному операндом адрес_таблицы_перекодировки.

Слово “таблица” весьма условно — по сути это просто строка байт. Адрес байта в строке, которым будет производиться замещение содержимого регистра al, определяется суммой (bx) + (al), то есть содержимое al выполняет роль индекса в байтовом массиве.

При работе с командой xlat обратите внимание на следующий тонкий момент. Несмотря на то, что в команде указывается адрес строки байт, из которой должно быть извлечено новое значение, этот адрес должен быть предварительно загружен (например, с помощью команды lea) в регистр bx. Таким образом, операнд адрес_таблицы_перекодировки на самом деле не нужен (необязательность операнда показана заключением его в квадратные скобки). Что касается строки байт (таблицы перекодировки), то она представляет собой область памяти размером от 1 до 255 байт (диапазон числа без знака в 8-битном регистре).

В качестве иллюстрации работы данной команды мы рассмотрим программу, которая преобразует двузначное шестнадцатеричное число, вводимое с клавиатуры (то есть в символьном виде), в эквивалентное двоичное представление в регистре al. Ниже (листинг 2) приведен вариант этой программы с использованием команды xlat. 

 

Листинг 2. Использование таблицы перекодировки

<1>;---------Prg_7_3.asm----------------------

<2>;Программа преобразования двузначного шестнадцатеричного числа

<3>;в двоичное представление с использованием команды xlat.

<4>;Вход: исходное шестнадцатеричное число; вводится с клавиатуры.

<5>;Выход: результат преобразования в регистре al.

<6>.data                ;сегмент данных

<7>  message    db      ‘Введите две шестнадцатеричные цифры,$’

<8>  tabl       db      48 dup (0),0,1,2,3,4,5,6,7,8,9, 8 dup (0),

<9>             db      0ah,0bh,0ch,odh,0eh,0fh,27 dup (0)

<10>    db      0ah,0bh,0ch,odh,0eh,0fh, 153 dup (0)

<11> .stack     256     ;сегмент стека

<12> .code

<13> ;начало сегмента кода

<14> proc       main    ;начало процедуры main

<15>    mov     ax,@data        ;физический адрес сегмента данных в регистр ax

<16>    mov     ds,ax   ;ax записываем в ds

<17>    lea     bx,tabl ;загрузка адреса строки байт в регистр bx

<18>    mov     ah,9

<19>    mov     dx,offset message

<20>    int     21h     ;вывести приглашение к вводу

<21>    xor     ax,ax   ;очистить регистр ax

<22>    mov     ah,1h   ;значение 1h в регистр ah

<23>    int     21h     ;вводим первую цифру в al

<24>    xlat    ;перекодировка первого введенного символа в al

<25>    mov     dl,al

<26>    shl     dl,4    ;сдвиг dl влево для освобождения места для младшей цифры

<27>    int     21h     ;ввод второго символа в al

<28>    xlat    ;перекодировка второго введенного символа в al

<29>    add     al,dl   ;складываем для получения результата

<30>    mov     ax,4c00h        ;пересылка 4c00h в регистр ax

<31>    int     21h     ;завершение программы

<32> endp       main    ;конец процедуры main

<33> code       ends    ;конец сегмента кода

<34> endmain    ;конец программы с точкой входа main

Сама по себе программа проста; сложность вызывает обычно формирование таблицы перекодировки. Обсудим этот момент подробнее.

Прежде всего нужно определиться с значениями тех байтов, которые вы будете изменять. В нашем случае это символы шестнадцатеричных цифр. Сконструируем в сегменте данных таблицу, в которой на места байтов, соответствующих символам шестнадцатеричных цифр, помещаем их новые значения, то есть двоичные эквиваленты шестнадцатеричных цифр. Строки 8-10 листинга 2 демонстрируют, как это сделать. Байты этой таблицы, смещения которых не совпадают со значением кодов шестнадцатеричных цифр, нулевые. Таковыми являются первые 48 байт таблицы, промежуточные байты и часть в конце таблицы.

Желательно определить все 256 байт таблицы. Дело в том, что если мы ошибочно поместим в al код символа, отличный от символа шестнадцатеричной цифры, то после выполнения команды xlat получим непредсказуемый результат. В случае листинга 2 это будет ноль, что не совсем корректно, так как непонятно, что же в действительности было в al — код символа “0” или что-то другое.

Поэтому, наверное, есть смысл здесь поставить “защиту от дурака”, поместив в неиспользуемые байты таблицы какой-нибудь определенный символ. После каждого выполнения xlat нужно будет просто контролировать значение в al на предмет совпадения с этим символом, и если оно произошло, выдавать сообщение об ошибке.

После того как таблица составлена, с ней можно работать. В сегменте команд строка 18 инициализирует регистр bx значением адреса таблицы tabl. Далее все очень просто. Поочередно вводятся символы двух шестнадцатеричных цифр, и производится их перекодировка в соответствующие двоичные эквиваленты. 

Команды работы со стеком

Эта группа представляет собой набор специализированных команд, ориентированных на организацию гибкой и эффективной работы со стеком.

Стек — это область памяти, специально выделяемая для временного хранения данных программы. Важность стека определяется тем, что для него в структуре программы предусмотрен отдельный сегмент. На тот случай, если программист забыл описать сегмент стека в своей программе, компоновщик tlink выдаст предупреждающее сообщение.

Для работы со стеком предназначены три регистра:

  1.  ss — сегментный регистр стека;
  2.  sp/esp — регистр указателя стека;
  3.  bp/ebp — регистр указателя базы кадра стека.

Размер стека зависит от режима работы микропроцессора и ограничивается 64 Кбайт (или 4 Гбайт в защищенном режиме).

В каждый момент времени доступен только один стек, адрес сегмента которого содержится в регистре ss. Этот стек называется текущим. Для того чтобы обратиться к другому стеку (“переключить стек”), необходимо загрузить в регистр ss другой адрес. Регистр ss автоматически используется процессором для выполнения всех команд, работающих со стеком.

Перечислим еще некоторые особенности работы со стеком:

  1.  запись и чтение данных в стеке осуществляется в соответствии с принципом LIFO (Last In First Out — “последним пришел, первым ушел”);
  2.  по мере записи данных в стек последний растет в сторону младших адресов. Эта особенность заложена в алгоритм команд работы со стеком;
  3.  при использовании регистров esp/sp и ebp/bp для адресации памяти ассемблер автоматически считает, что содержащиеся в нем значения представляют собой смещения относительно сегментного регистра ss.

В общем случае стек организован так, как показано на рис. 2.

Рис. 2. Концептуальная схема организации стека

Для работы со стеком предназначены регистры ss, esp/sp и ebp/bp.

Эти регистры используются комплексно, и каждый из них имеет свое функциональное назначение.

Регистр esp/sp всегда указывает на вершину стека, то есть содержит смещение, по которому в стек был занесен последний элемент. Команды работы со стеком неявно изменяют этот регистр так, чтобы он указывал всегда на последний записанный в стек элемент. Если стек пуст, то значение esp равно адресу последнего байта сегмента, выделенного под стек.

При занесении элемента в стек процессор уменьшает значение регистра esp, а затем записывает элемент по адресу новой вершины.

При извлечении данных из стека процессор копирует элемент, расположенный по адресу вершины, а затем увеличивает значение регистра указателя стека esp.

Таким образом, получается, что стек растет вниз, в сторону уменьшения адресов.

Что делать, если нам необходимо получить доступ к элементам не на вершине, а внутри стека?

Для этого применяют регистр ebp. Регистр ebpрегистр указателя базы кадра стека.

Например, типичным приемом при входе в подпрограмму является передача нужных параметров путем записи их в стек. Если подпрограмма тоже активно работает со стеком, то доступ к этим параметрам становится проблематичным. Выход в том, чтобы после записи нужных данных в стек сохранить адрес вершины стека в указателе кадра (базы) стека — регистре ebp. Значение в ebp в дальнейшем можно использовать для доступа к переданным параметрам.

Начало стека расположено в старших адресах памяти. На рис. 2 этот адрес обозначен парой ss:ffff. Смещение ffff приведено здесь условно. Реально это значение определяется величиной, которую программист задает при описании сегмента стека в своей программе.

К примеру, для программы в листинге 2 началу стека будет соответствовать пара ss:0100h. Адресная пара ss:ffff — это максимальное для реального режима значение адреса начала стека, так как размер сегмента в нем ограничен величиной 64 Кбайт (0ffffh).

Для организации работы со стеком существуют специальные команды записи и чтения.

push источник — запись значения источник в вершину стека.

Интерес представляет алгоритм работы этой команды, который включает следующие действия (рис. 3):

  1.  (sp) = (sp) – 2; значение sp уменьшается на 2;
  2.  значение из источника записывается по адресу, указываемому парой ss:sp.

Рис. 3. Принцип работы команды push

pop назначение — запись значения из вершины стека по месту, указанному операндом назначение. Значение при этом “снимается” с вершины стека.

Алгоритм работы команды pop обратен алгоритму команды push (рис. 4):

  1.  запись содержимого вершины стека по месту, указанному операндом назначение;
  2.  (sp) = (sp) + 2; увеличение значения sp.

Рис. 4. Принцип работы команды pop

pusha — команда групповой записи в стек.

По этой команде в стек последовательно записываются регистры ax, cx, dx, bx, sp, bp, si, di. Заметим, что записывается оригинальное содержимое sp, то есть то, которое было до выдачи команды pusha (рис. 5).

Рис. 5. Принцип работы команды pusha

pushaw — почти синоним команды pusha. В чем разница? На уроке 5 мы обсуждали один из атрибутов сегмента — атрибут разрядности. Он может принимать значение use16 или use32.

Рассмотрим работу команд pusha и pushaw при каждом из этих атрибутов:

  1.  use16 — алгоритм работы pushaw аналогичен алгоритму pusha.
  2.  use32 — pushaw не изменяется (то есть она нечувствительна к разрядности сегмента и всегда работает с регистрами размером в слово — ax, cx, dx, bx, sp, bp, si, di). Команда pusha чувствительна к установленной разрядности сегмента и при указании 32-разрядного сегмента работает с соответствующими 32-разрядными регистрами, то есть eax, ecx, edx, ebx, esp, ebp, esi, edi.

pushad — выполняется аналогично команде pusha, но есть некоторые особенности, которые вы можете узнать из “Справочника команд”.

Следующие три команды выполняют действия, обратные вышеописанным командам:

popa;

popaw;

popad.

Группа команд, описанная ниже, позволяет сохранить в стеке регистр флагов и записать слово или двойное слово в стеке. Отметим, что перечисленные ниже команды — единственные в системе команд микропроцессора, которые позволяют получить доступ (и которые нуждаются в этом доступе) ко всему содержимому регистра флагов.

pushf — сохраняет регистр флагов в стеке.

Работа этой команды зависит от атрибута размера сегмента:

  1.  use16 — в стек записывается регистр flags размером 2 байта;
  2.  use32 — в стек записывается регистр eflags размером 4 байта.

pushfw — сохранение в стеке регистра флагов размером в слово. Всегда работает как pushf с атрибутом use16.

pushfd — сохранение в стеке регистра флагов flags или eflags в зависимости от атрибута разрядности сегмента (то есть то же, что и pushf).

Аналогично, следующие три команды выполняют действия, обратные рассмотренным выше операциям:

popf 

popfw 

popfd 

И в заключение отметим основные виды операции, когда использование стека практически неизбежно:

  1.  вызов подпрограмм;
  2.  временное сохранение значений регистров;
  3.  определение локальных переменных.

 

А также другие работы, которые могут Вас заинтересовать

27037. Структура и содержание отчета о прибылях и убытках. Техника заполнения отчета о прибылях и убытках 21.97 KB
  Соврый отчет предостт инфию о формирии финх резтов по разнообразным видам деятти оргии а также итоги разлх фактов хозой деятти за отчетный период способных повлиять на величину конечного финго резта. Иначе говоря между бухгм балансом и отчетом о прибылях и убытках сущестт тесная взаимосвязь которая выражается через важнейший показатель бухгой отчти финый резт хозой деятти оргии. В свою очередь уменьшение активов представленных в бухгом балансе происхт в резте превышения расходов над доходами оргии которое...
27038. Сущность балансового обобщения, его отличительные особенности 13.14 KB
  Двойственный характер отражения информации состоит в том что реальные объекты описываемые при помощи баланса обязательно выражаются в двух аспектах которые выбираются при построении конкретного баланса в зависимости от назначения обобщаемой информации; 2. Уравненностъ показателей состоит в равенстве двух совокупностей баланса. В одних балансах это равенство вытекает из самого характера отражаемых явлений в других балансах равенство достигается применением балансирующих показателей; 3. Основой построения бухгалтерского баланса является...
27039. Синтетический учет поступления ОС 16.35 KB
  Синтетический учет поступления ОС Материальные объекты имущества независимо от их стоимости со сроком полезного использования более 12 месяцев предназначенные для неоднократного или постоянного использования на праве оперативного управления в процессе деятельности учреждения при выполнении им работ оказании услуг осуществления государственных полномочий функций либо для управленческих нужд учреждения находящиеся в эксплуатации запасе на консервации сданные в аренду полученные в лизинг сублизинг принимаются к учету в качестве...
27040. Анализ движения и обеспеченности основными средствами 13.06 KB
  Анализ движения и обеспеченности основными средствами В процессе осуществления бюджми учрми своей деятти происхт постое движие объектов ОС. Учрия приобрт ОС за счет различх источников – приобрие за плату за счет срв бюджета за счет срв от приносящей доход деятти безвозмое поступление от физх и юридх лиц на услях аренды. Для общей оценки движения ОС учрия испт ряд коэфтов которые отражт интенсивность процессов поступления и выбытия объектов. Харкой данного процесса служит коэфт прогрессивности обновления который...
27041. Анализ эффективности использования активов 17.02 KB
  Анализ эффективности использования активов Сведения о размещении капитала имеющегося в распоряжении предприятия содержатся в активе баланса. Оценка активов двояка. С другой стороны необходимо обладать информацией о реальной величине стоимости отдельных активов совокупное значение которых позволяет оценить имущественный комплекс потенциал компании. Эффективность использования активов это результат взаимодействия многих составляющих.
27042. Аудит кассовых операций 15.58 KB
  Аудит кассовых операций. Целью аудиторской проверки кассовых операций является установление соответствия применяемой в организации методики учета и налогообложения операций по движению наличных денежных средств действующим в РФ в проверяемом периоде нормативным документам для формирования мнения о достоверности бухгалтерской отчетности во всех существен. № 129ФЗ Письмо ЦБ РФ О ведение кассовых операций утвержденного решением Совета директоров от 22. Рекомендации по осуществлению учреждениями банков проверок соблюдения предприятиями...
27043. Определение оптимального размера заказа 17.87 KB
  Определение оптимального размера заказа Оптимальный размер заказа будет определяться теми затратами на которые оказывают влияние количество хранящихся запасов или количество сделанных заказов. Оптимальный размер заказа – это такое заказанное количество при котором стоимость всего объема заказов и хранения запасов будет минимальной. Определение наиболее экономичного размера заказа предусматривает заказ партий материалов которые независимы от других видов материалов. Величины партий таких материалов деталей и изделий следует координировать с...
27044. Особенности учета основных средств 15.19 KB
  Особенности учета основных средств Оценка и учет ОС в НКО аналогичны оценке и учету этого вида активов в оргх занятых предпрой деяттью. Таким образом поступление и выбытие объектов основных средств оформляются следующими проводками: Дт 08 Кт учета расчетов и затрат 60 23 70 69 10 и т. стти фактх затрат вспомогх произв как по изготовлению объектов ОС так и по вспомогм работам связанным с доставкой и установкой приобрх объектов оплаты труда с начислениями работников оргии труд которых испся при осущии операций...
27045. Понятие и виды оценки, ее принципы и значение 16.92 KB
  Стоимостная или денежная оценка есть особый вид экономического измерения при котором существенное значение имеет выбор единицы измерения. Как правило к имуществу первого рода применима оценка по себестоимости к имуществу второго рода оценка по цене. Можно различить две формы выражения оценки имущественных статей в балансе: 1 непосредственная оценка с помощью одной статьи; 2 опосредованная оценка с помощью двух статей одна из которых является контрстатьей. Имущество может подвергаться переоценке уточнению стоимости причем...