Циклы ассемблер: Ассемблер. Циклы / Ravesli

Содержание

Ассемблер. Циклы / Ravesli

  Обновл. 4 Сен 2021  | 

Инструкция JMP может быть использована для выполнения циклов. Например, следующий фрагмент кода может использоваться для выполнения тела цикла 10 раз:

MOV CL, 10 L1: <LOOP-BODY> DEC CL JNZ L1

MOV CL, 10

L1:

<LOOP-BODY>

DEC CL

JNZ L1

Набор инструкций процессора включает в себя группу инструкций цикла для реализации итерации. Основная инструкция цикла LOOP имеет следующий синтаксис:

LOOP label

Где label — это метка, которая идентифицирует целевую инструкцию. Инструкция LOOP предполагает, что регистр ECX содержит в себе счетчик циклов. Когда инструкция цикла выполняется, регистр ECX уменьшается, точка выполнения программы переходит к метке до тех пор, пока значение регистра ECX (т.е. значение счетчика цикла) не достигнет нуля.

Вышеприведенный пример можно записать следующим образом:

mov ECX,10 l1: <loop body> loop l1

mov ECX,10

l1:

<loop body>

loop l1

А здесь с помощью цикла мы выводим на экран цифры от 1 до 9:

section .text global _start ; должно быть объявлено для использования gcc _start: ; сообщаем линкеру входную точку mov ecx,10 mov eax, ‘1’ l1: mov [num], eax mov eax, 4 mov ebx, 1 push ecx mov ecx, num mov edx, 1 int 0x80 mov eax, [num] sub eax, ‘0’ inc eax add eax, ‘0’ pop ecx loop l1 mov eax,1 ; номер системного вызова (sys_exit) int 0x80 ; вызов ядра section .bss num resb 1

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

section .text

   global _start        ; должно быть объявлено для использования gcc

_start:                 ; сообщаем линкеру входную точку

   mov ecx,10

   mov eax, ‘1’

l1:

   mov [num], eax

   mov eax, 4

   mov ebx, 1

   push ecx

   mov ecx, num        

   mov edx, 1        

   int 0x80

   mov eax, [num]

   sub eax, ‘0’

   inc eax

   add eax, ‘0’

   pop ecx

   loop l1

   mov eax,1             ; номер системного вызова (sys_exit)

   int 0x80              ; вызов ядра

section .bss

num resb 1

Результат выполнения программы:

123456789:

Оценить статью:

Загрузка…

Поделиться в социальных сетях:

Циклы в ассемблере. — it-black.ru

В любом языке программирования, как и в языке Assembler, циклом называется повторяющееся выполнение последовательности команд. Рассмотрим сегодня как организовывать циклы в Assemblere.

Команда LOOP

Для организации цикла предназначена команда LOOP. У этой команды один операнд — имя метки, на которую осуществляется переход. В качестве счётчика цикла используется регистр CX. Команда LOOP выполняет декремент CX, а затем проверяет его значение. Если содержимое CX не равно нулю, то осуществляется переход на метку, иначе управление переходит к следующей после LOOP команде.

Содержимое CX интерпретируется командой как положительное число. В CX нужно помещать число, равное требуемому количеству повторений цикла. Метка должна находиться в диапазоне -127…+128 байт от команды LOOP (иначе будет ошибка).

Метка представляет собой символическое имя, вместо которого компилятор подставляет адрес. Имена переменных, объявленных с помощью директив объявления данных, тоже являются метками. Но с ними компилятор дополнительно связывает размер переменной. Метка объявляется очень просто: достаточно в начале строки написать имя и поставить двоеточие. Например:


m1: mov ax,4C00h
    int 21h

Теперь вместо имени m1 компилятор везде будет подставлять адрес команды mov ax,4C00h. Имя метки может состоять из латинских букв, цифр и символов подчёркивания, но должно начинаться с буквы. Имя метки должно быть уникальным. В качестве имени метки нельзя использовать директивы и ключевые слова компилятора, названия команд и регистров.

Пример цикла

В качестве примера напишем простую программу, которая будет печатать все буквы английского алфавита. ASCII-коды этих символов расположены последовательно, поэтому можно выводить их в цикле. Для вывода символа на экран используется функция DOS 02h (выводимый байт должен находиться в регистре DL).


use16                 ;Генерировать 16-битный код
org 100h              ;Программа начинается с адреса 100h
 
    mov ah,02h        ;Для вызова функции DOS 02h - вывод символа
    mov dl,'A'        ;Первый выводимый символ
    mov cx,26         ;Счётчик повторений цикла
metka:
    int 21h           ;Обращение к функции DOS
    inc dl            ;Следующий символ
    loop metka        ;Команда цикла
 
    mov ah,09h        ;Функция DOS 09h - вывод строки
    mov dx,press      ;В DX адрес строки
    int 21h           ;Обращение к функции DOS
 
    mov ah,08h        ;Функция DOS 08h - ввод символа без эха
    int 21h           ;Обращение к функции DOS
 
    mov ax,4C00h      ;\
    int 21h           ;/ Завершение программы
;-------------------------------------------------------
press:
    db 13,10,'Press any key...$'

Команды «int 21h» и «inc dl» будут выполняться в цикле 26 раз. Для того, чтобы программа не закрылась сразу, используется функция DOS 08h — ввод символа с клавиатуры без эха, то есть вводимый символ не отображается.

Вложенные циклы

Вложенный цикл – это цикл внутри другого цикла. Чтобы сделать вложенный цикл необходимо сохранить значение CX перед началом вложенного цикла и восстановить после его завершения (перед командой LOOP внешнего цикла). Сохранить значение можно в другой регистр, во временную переменную или в стек. Следующая программа выводит все доступные ASCII-символы в виде таблицы 16×16. Значение счётчика внешнего цикла сохраняется в регистре BX.


use16                 ;Генерировать 16-битный код
org 100h              ;Программа начинается с адреса 100h
 
    mov ah,02h        ;Для вызова функции DOS 02h - вывод символа
    sub dl,dl         ;Первый выводимый символ
    mov cx,16         ;Счётчик внешнего цикла (по строкам)
lp1:
    mov bx,cx         ;Сохраняем счётчик в BX
    mov cx,16         ;Счётчик внутреннего цикла (по столбцам)
lp2:
    int 21h           ;Обращение к функции DOS
    inc dl            ;Следующий символ
    loop lp2          ;Команда внутреннего цикла
 
    mov dh,dl         ;Сохраняем значение DL в DH
    mov dl,13         ;\
    int 21h           ; \
    mov dl,10         ; / Переход на следующую строку
    int 21h           ;/
    mov dl,dh         ;Восстанавливаем значение DL
 
    mov cx,bx         ;Восстанавливаем значение счётчика
    loop lp1          ;Команда внешнего цикла
 
    mov ah,09h        ;Функция DOS 09h - вывод строки
    mov dx,press      ;В DX адрес строки
    int 21h           ;Обращение к функции DOS
 
    mov ah,08h        ;Функция DOS 08h - ввод символа без эха
    int 21h           ;Обращение к функции DOS
 
    mov ax,4C00h      ;\
    int 21h           ;/ Завершение программы
;-------------------------------------------------------
press db 13,10,'Press any key...$'

Ассемблер. Организация циклов. Циклы со счетчиком

Лабораторная работа №7

Организация циклов. Циклы со счетчиком

Вопросы для повторения:

  1. Какие операторы цикла используются в языках программирования высокого уровня?
  2. Можно ли записать эти циклы, используя только условные операторы?

Цикл – особая алгоритмическая структура, без которой не обойдется ни один язык программирования. Организовать циклическое выполнение части кода программы можно при помощи команд передачи управления.

Задача: необходимо вывести на экран цифры от ‘0’ до ‘9’, используя цикл со счетчиком.

Цикл со счетчиком можно организовать, используя те же условные команды, взяв в качестве счетчика любой свободный регистр. Но в микропроцессоре предусмотрены специальные команды для организации таких циклов: loop / loope / loopne . Эти команды используют в качестве счетчика регистр cx, они сами уменьшают его значение после каждой итерации цикла и сравнивают после уменьшения с нулём.

Команда loop <метка перехода> выполняет следующие действия:

  • уменьшает регистр cx ;
  • сравнивает cx с нулем, если cx >0, то управление передается на метку перехода (продолжаем цикл).

Команды loope/loopne позволяют выйти из цикла по дополнительному условию.

Примечание: при написании вложенных циклов loop

, необходимо помнить, что все они используют для счетчика один и тот же регистр – cx . Для правильной работы необходимо сохранить счетчик внешнего цикла ( push cx ) до инициализации внутреннего и восстановить его ( pop cx ) после команды loop внутреннего цикла.

  mov cx, 10
  mov dl, '0'
  mov ah, 02
cikl:  
  int 21h
  inc dl
  loop cikl

Задания для выполнения:

  1. С клавиатуры вводится 10 цифр. Вывести на экран их сумму. (8 баллов)
  2. Используя цикл в цикле, вывести на экран следующий прямоугольник: ( 8 баллов)
12345
23456
34567
45678
56789

Задания для самостоятельного выполнения:

  1. Найти сумму натуральных чисел от 1 до N ( N вводится с клавиатуры). (5 баллов)
  2. Вывести на экран прямоугольник из символов h размером m x n , начиная с позиции ( x , y ). x , y , m , n , h – вводятся с клавиатуры. (10 баллов)

ассемблер — Цикл в ассемблере

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

С первым символом программа работает без проблем,с последующими мне не выводиться ни правильное число в двоичном формате,подсчет единичных бит тоже не работает.Я подозреваю,что проблема в том,что я перехожу в начало программы(с помощью метки) и что-то остается с предыдущего выполнения,пробовал обнулить регистры,все равно ничего не получается.

Как перейти в начало программы,чтоб при этом она работала с новым символом?Тоесть как вернуть все регистры и переменные,кроме counter,в исходное положение?

.8086
.model small
.stack 200h
DATA SEGMENT    
    counter dw 0
    STR1 DB "BINARY NUMBER IS : $"
    STR2 DB "DECIMAL NUMBER IS : $"
    BSTR DB 20 DUP("$")
    RSTR DB 20 DUP("$")
    NEWLINE DB 13,10,"$"
    CNT DB 0
    N DB 2
    H DB 16
    D DB 10H
    NUM DB ?
    SNUM DB ?
    HNUM DB 0H

  DATA ENDS
  CODE SEGMENT
      ASSUME CS:CODE,DS:DATA 
  START:  

    MOV AX,DATA
    MOV DS,AX
    xor ax,ax 

    ;
    EchoLoop:  
    mov HNUM,0h

    xor ax,ax
    xor al,al
    xor ah,ah
    xor bx,bx 
    xor dx,dx
    ;xor cx,cx
    xor dh,dh
    xor dl,dl


    mov ah,1
    int 21h
    cmp al,13 ;Если символ Enter,выходим
    jz EchoDone
    mov HNUM,al
    ;Перевод из 16 в нужный нам формат------------------------------
    ;CONVERT HEXA TO DECIMAL

    MOV CX,00
    MOV DX,00

    L6:MOV AX,00
    MOV AL,HNUM
    DIV D
    MOV HNUM,AL

    MOV BX,AX
    MOV CL,CNT
    MOV AX,1
    L5: CMP CL,00
        JE L7
        MUL H
        SUB CL,1
        JMP L5    
   L7: MUL BH
    ADD DX,AX
    ADD CNT,1
    CMP HNUM,0
    JG L6
    MOV NUM,DL


    ;CONVERT DECIMAL TO BINARY
    LEA SI,BSTR
    LEA DI,RSTR
L1: MOV AX,00
    MOV AL,NUM
    DIV N
    ADD AH,30H
    MOV BYTE PTR[SI],AH
    INC SI
    MOV NUM,AL
    CMP AL,0
    JG L1

    DEC SI

 L2:MOV BL,BYTE PTR[SI]
    MOV BYTE PTR[DI],BL
    DEC SI
    INC DI
    CMP SI,0
    JNE L2
 ;Перевод из 16 в нужный нам формат------------------------------
    ;MOV AH,09H
    ;LEA DX,STR1
    ;INT 21H



    MOV AH,09H
    LEA DX,RSTR
    INT 21H

    xor si,si        
    xor bx,bx 

    mov cx,20
    ;Подсчет единичных бит
    cycle:
    inc si
    cmp RSTR[si-1],'1'
    jz metka2
    loop cycle       


    jmp EchoLoop ;Переход на начало
    MOV AH,4CH
    INT 21H    


    metka2:
    inc counter  ;schetchik edinichnuh bit
    loop cycle   

    EchoDone:
    mov ah,4ch
    int 21h

    CODE ENDS
    END START

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

На 2 картинке:ввожу символ с,мне выводит его двоичный код,ввожу символ e,опять выводит мусор.

Организация циклов в Ассемблере Цикл это

Организация циклов в Ассемблере

Цикл – это многократно повторяющаяся последовательность операторов

Типы циклов «ДО» «ПОКА» «ДЛЯ»

Циклы в Паскале

Цикл «ПОКА» While X > 0 do S A: If X > 0 then begin S; тело цикла Goto A; end;

Цикл «ДО» Repeat S until X > 0 A: S; тело цикла If (X

Цикл «ДЛЯ» For I : = 1 to N do S I: = 1; A: S; тело цикла I: =I+1; If (I

Циклы в Ассемблере

Цикл «ПОКА» While X > 0 do S A: CMP X , 0 JLE A 2 S; тело цикла JMP A A 2: …

Цикл «ДО» Repeat S until X > 0 A: S; тело цикла CMP X , 0 JLE A

Цикл «ДЛЯ» For I : = 1 to N do S MOV CX , N A: S; тело цикла DEC CX CMP X , 0 JNE A

Команда LOOP Общий вид: LOOP Функции команды: l Автоматически уменьшает значение счетчика. l Выполняет проверку на выход из цикла. l Выполняет переход на начало тела цикла. Используется в случае цикла с известным числом повторений, т. е. цикла «ДЛЯ» . Количество повторений цикла должно быть присвоено регистру СХ до начала цикла.

Цикл «ДЛЯ» Без использования команды LOOP С использованием команды LOOP MOV CX , N A: S; тело цикла DEC CX CMP X , 0 JNE A MOV CX , N A: S; тело цикла LOOP A

ПРИМЕР Составим программу, которая выводит на экран 1000 нулей

Решение: (1) prg segment para public ‘code’ (2) assume cs: prg, ss: prg, es: prg, ds: prg (3) org 100 h (4) start: jmp go (5) go: (6) mov ax, 0600 h (7) mov bh, 07 (8) mov cx, 0000 (9) mov dx, 184 fh (10) mov cx, 1000 (11) Zero: (12) mov ah, 02 (13) mov dl, 30 h (14) int 21 h (15) loop Zero (16) ret (17) prg ends (18) end start

Задачи для практики

Задача 1 Составить фрагмент программы на языке Ассемблер, подсчитывающий сумму первых 10 натуральных чисел (результат записать в АХ). Решение: …. . mov cx, 10 mov ax, 00 summa: add ax, cx loop summa …. .

Задача 2 Составить фрагмент программы на языке Ассемблер, вычисляющий значение выражения: (результат записать в АХ). Решение: …. . mov BX, 00 mov CX, 05 sum: mov AX, 02 mul CX add BX, AX loop sum …. .

Задача 3 Составить фрагмент программы на языке Ассемблер, вычисляющий факториал заданного числа К (К – от 0 до 8; результат записать в АХ). Решение: F: …. . mov ax, 1 mov cx, К mul cx loop F …. .

Assembler: 19. Команды организации циклического выполнения программ.

Команда LOOP позволяет организовать циклы (loops), подобные циклам for в языках высокого уровня с автоматическим уменьшением счетчика цикла.
Синтаксис команды:

Команда реализует описанные далее действия.

  • Декремент регистра ЕСХ/СХ.
  • Сравнение регистра ЕСХ/СХ с нулем:
    • если (ЕСХ/СХ) > 0, то управление передается на метку перехода;
    • если (ЕСХ/СХ) = 0, то управление передается на следующую после LOOP команду.

Команды LOOPE и LOOPZ (Loop still сх 0 or Zero flag = 0 — повторить цикл пока СХ 0 и ZF = 0) — абсолютные синонимы, поэтому используйте ту команду, которая вам больше нравится.
Синтаксис команд:

Команды реализуют описанные далее действия.

  • Декремент регистра ЕСХ/СХ.
  • Сравнение регистра ЕСХ/СХ с нулем и анализ состояния флага нуля ZF:
    • если (ЕСХ/СХ) > 0 и ZF = 1, управление передается на метку перехода;
    • если (ЕСХ/СХ) = 0 или ZF = 0, управление передается на следующую после LOOP команду.

Команды LOOPNE и LOOPNZ(Loop still сх 0 and NonZero flag = 0 — повторить цикл, пока СХ 0 и ZF = 1) также абсолютные синонимы.
Синтаксис команд:

Команды реализуют описанные далее действия.

  • Декремент регистра ЕСХ/СХ.
  • Сравнение регистра ЕСХ/СХ с нулем и анализ состояния флага нуля ZF:
    • если (ЕСХ/СХ) = 0 и ZF = 0, управление передается на метку перехода;
    • если (ЕСХ/СХ) = 0 или ZF= 1, управление передается на следующую после LOOP команду.

Команды LOOPE/LOOPZ и LOOPNE/LOOPNZ по принципу своей работы являются взаимнообратными. Они расширяют действие команды LOOP тем, что дополнительно анализируют флаг ZF. Это дает возможность организовать досрочный выход из цикла, используя этот флаг в качестве индикатора. Недостаток команд организации цикла LOOP, LOOPE/LOOPZ и LOOPNE/LOOPNZ заключается в том, что они реализуют только короткие переходы (от -128 до + 127 байт).

Алгоритмическая структура «Цикл» в языке Ассемблер

К изучению языка Ассемблер учащиеся подходят, как правило, имея начальные знания в области программирования. Поэтому им проще будет понять, как реализуются основные алгоритмические структуры в Ассемблере, если при изложении нового материала преподаватель будет проводить аналогию с изученным ими ранее языком программирования (например, Turbo Pascal).

Алгоритмическая структура “цикл”, как известно, обеспечивает выполнение некоторой последовательности действий, которая называется телом цикла.

Выделяется три типа циклов: цикл “ДЛЯ”, цикл “ПОКА”, цикл “ДО”. Друг от друга различные типы циклов отличаются в основном лишь способом проверки окончания цикла.

Приложение

Рис. 1

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

Рис. 2

Рис. 3

Рис. 4

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

Рис. 5

Рис. 6

Рис. 7

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

Это команда LOOP <метка>.

Данная команда выполняет следующие функции:

    1. Автоматически уменьшает значение счетчика.
    2. Выполняет проверку на выход из цикла.
    3. Выполняет переход на начало тела цикла.

Команда LOOP может быть использована лишь в случае цикла с известным числом повторений, т.е. цикла “ДЛЯ”. Количество повторений цикла должно быть присвоено регистру СХ до начала цикла.

Рис. 8

Таким образом, команда LOOP заменила тройку команд:

Рассмотрим использование этой команды на практике.

Пример: Составим программу, которая выводит на экран 1000 нулей.

(1) prg segment para public ‘code’
(2) assume cs:prg,ss:prg,es:prg,ds:prg
(3) org 100h
(4) start: jmp go
(5) go:
(6) mov ax, 0600h
(7) mov bh,07
(8) mov cx, 0000
(9) mov dx,184fh
(10) mov cx,1000
(11) Zero:
(12) mov ah,02
(13) mov dl,30h
(14) int 21h
(15) loop Zero
(16) ret
(17) prg ends
(18) end start

Строки с (1) по (10) и с (16) по (18) вы уже знаете.

Строка (11) – это метка (начало цикла). Строка (15) – конец цикла. Все, что находится в пределах строк (11) – (15), является циклом. Сам цикл будет повторяться 1000 раз, для чего мы и заносим в СХ число 1000 (строка (10)).

В строке (12) заносим в регистр ah число 02 (запрос функции вывода одного символа).

В строке (13) в регистр dl заносим код выводимого символа (код символа “0” – 30h).

В строке (14) вызываем прерывание int 21h.

Теперь на экране появится первый ноль. Остается уменьшить счетчик (СХ) на 1 и повторить. Что мы и делаем в строке (15).

Задача 1 для практики: Составить фрагмент программы на языке Ассемблер, подсчитывающий сумму первых 10 натуральных чисел (результат записать в АХ).

Решение:

…..
mov cx,10
mov ax,00
summa:
add ax,cx
loop summa
…..

Задача 2 для практики: Составить фрагмент программы на языке Ассемблер, вычисляющий значение выражения: (результат записать в АХ).

Решение:

…..
mov BX,00
mov CX,05
sum:
mov AX,02
mul CX
add BX,AX
loop sum
…..

Задача 3 для практики: Составить фрагмент программы на языке Ассемблер, вычисляющий факториал заданного числа К (К – от 0 до 8).

Решение:

…..
mov ax, 1
mov cx, К
F: mul cx
loop F
…..

Приложение

While, Do While, циклы For на языке ассемблера (emu8086)

Для цикла в C:

  для (int x = 0; x <= 3; x ++)
{
    //Сделай что-нибудь!
}
  

Тот же цикл в ассемблере 8086:

  xor cx, cx; cx-register - это счетчик, установленный в 0
loop1 nop; Все, что вы хотите сделать, идет сюда, не следует менять cx
        inc cx; Инкремент
        cmp cx, 3; Сравните cx до предела
        jle loop1; Цикл, пока меньше или равно
  

Это цикл, если вам нужно получить доступ к вашему индексу (cx).Если вы просто хотите что-то 0-3 = 4 раза, но вам не нужен индекс, это будет проще:

  mov cx, 4; 4 итерации
loop1 nop; Все, что вы хотите сделать, идет сюда, не следует менять cx
        loop loop1; инструкция цикла уменьшает cx и переходит к метке, если не 0
  

Если вы просто хотите выполнять очень простую инструкцию постоянное количество раз, вы также можете использовать директиву ассемблера, которая просто жестко обработает эту инструкцию

  раз 4 ноп
  

Do-while-цикл в C:

  int x = 1;
делать{
    //Сделай что-нибудь!
}
в то время как (x == 1)
  

Тот же цикл в ассемблере:

  мов топор, 1
loop1 nop; Все, что вы хотите сделать, идет сюда
        cmp ax, 1; Убедитесь, что cx равен 1
        je loop1; И цикл, если равен
  

Цикл while в C:

  в то время как (x == 1) {
    //Сделай что-нибудь
}
  

Тот же цикл в ассемблере:

  jmp loop1; Сначала перейти к условию
cloop1 nop; Выполнить содержимое цикла
loop1 cmp ax, 1; Проверить состояние
        je cloop1; Перейти к содержанию цикла, если встретились
  

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

петель

Контур - это элемент управления структура, которая позволяет многократно последовательно выполнять блок инструкций, тело цикла . В этой статье мы исследуем петлевое управление. структуры и как они построены на языке ассемблера.Есть две категории петель:

1) Счетные циклы - Циклы, в которых номер итерации, количество раз, которое цикл должен быть выполнен, известно до того, как цикл будет вошел.

2) Условные циклы - Циклы, которые будут непрерывно повторяться, пока не произойдет заданное условие.

Создание Счетные петли

Самая распространенная инструкция по созданию счетный цикл - это инструкция Branch On Count, которая имеет мнемонику BCT .Номер итерации сначала загружается в регистр, который впоследствии манипулируется BCT . Каждый раз, когда выполняется BCT , номер итерации в регистре равен уменьшается на единицу. После регистрации уменьшается, регистр проверяется. Если результат в регистре не равен нулю, выполняется переход к адрес, указанный в операнде 2. Если тест показывает, что результат в регистре равен нулю, цикл завершен и выполнение продолжается с инструкцией, следующей за BCT .Вот пример цикла это будет повторяться 10 раз.

LA R5,10 PUT ИТЕРАЦИЯ № IN R5

LOOPTOP EQU *

... ПЕТЛЕВОЕ ТЕЛО ПРОХОДИТ ЗДЕСЬ

BCT R5, ПЕТЛЯ ЗАЯВЛЕНИЕ R5, ЕСЛИ НЕ 0, НАЗАД

В приведенном выше коде регистр, который будет управлять циклом, инициализируется в 10, а затем выполняются операторы в теле цикла. В конце первой итерации BCT вычитает 1 из регистра 5, оставив его равным 9.Реестр проверено и поскольку оно не содержит нуля, ветка возвращается в LOOPTOP. Тело цикла выполняется второй раз, и снова BCT вычитает 1 из регистра 5, оставив его установленным на 8. BCT проверяет содержание R5, который теперь 8 и не найдя его нуля, возвращается к LOOPTOP. Этот процесс продолжается 10 итераций. тела петли. На десятой итерации BCT уменьшает регистр и результат становится нулевым.Тестирование R5 показывает, что он равен нулю. На этот раз ветка не занята и управление возвращается к оператору, следующему за ветвью по команде счетчика.

Есть две другие инструкции, которые иногда используются для реализовать счетный цикл. Первое инструкция, которую мы рассматриваем, называется Branch on Index Less Than или Равный. Мнемоника для этого инструкция BXLE . В кодированном виде имеет три операнда:

1) Операнд 1 - это регистр, содержащий счетчик или адрес.

2) Операнд 2 обычно является четным регистром четно-нечетного последовательная пара регистров. Даже регистр содержит значение, которое используется для увеличения или уменьшения значения в Операнд 1.

Нечетный регистр, не закодирован в инструкции, содержит лимит или адрес, по которому операнд 1 сравнивается.

3) Операнд 3 представляет адрес, по которому инструкция будет ветвь, если значение операнда 1 меньше или равно пределу в нечетном регистр.

Например, рассмотрим следующую инструкцию.

BXLE R3, R4, LOOPTOP

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

Каждый раз, когда выполняется, значение в четном регистре, R4, добавляется к значению в регистре операнда 1, R3. Если результат меньше или равен значение в нечетном регистре, R5, происходит переход к адресу в операнде 3, ПЕТЛЯ.В приведенном ниже коде используется BXLE для реализации цикла.

SR R3, R3 ПОСТАВИТЬ 0 В R3

LA R4,10 ПОЛУЧИТЬ ПРИРОСТ ДАЖЕ REG

LA R5 100 УКАЗАТЬ ПРЕДЕЛЬНОЕ ЗНАЧЕНИЕ В НЕЧЕТНОМ РЕЖИМЕ

LOOPTOP EQU *

... ПЕТЛЕВОЙ КОРПУС

BXLE R3, R4, LOOPTOP ВЫПОЛНИТЬ ЦИКЛ

Во-первых, счет в R3 равен инициализировано 0, приращение установлено на 10, а предел установлен на 100.Каждый раз, когда выполняется BXLE , приращение в R4 добавляется к счету в R3. и результат сравнивается с пределом в R5. Если новый счетчик меньше или равен предельному значению, происходит переход вернуться в LOOPTOP. Эффект оператор должен выполнить цикл 11 раз. (Цикл выполняется один раз при условии равенства.)

BXLE есть компаньон инструкция называется Branch on Index High. Мнемоника - BXH , а инструкция по исполнению аналогична BXLE , за исключением того, что ветвление происходит при высоком состоянии, а не ниже или равный.Следующий код дает пример этой инструкции.

LA R3,5 УСТАНОВИТЕ СЧЁТ НА 5

L R4, = F-1 УСТАНОВИТЬ ЗАЯВЛЕНИЕ НА -1

SR R5, R5 УСТАНОВИТЕ ПРЕДЕЛЬНОЕ ЗНАЧЕНИЕ 0

LOOPTOP EQU *

... ПЕТЛЕВОЙ КОРПУС

BXH R3, R4, LOOPTOP ВЫПОЛНИТЬ ЦИКЛ

В приведенном выше примере count установлено на 5, декремент равен -1, а предел равен 0.Каждый раз, когда выполняется BXH, декремент добавляется к счетчику, уменьшая его на 1. Пока результат выше предела 0, происходит переход к ПЕТЛЯ. Результатом является выполнение петлю тела 5 раз.

Главный недостаток использования BXLE и BXH заключается в том, что обе инструкции требуется 3 регистра. Поскольку регистры в большинстве программ обычно ценятся, циклы часто реализуются с использованием BCT .

Хотя инструкции, описанные выше, были специально предназначен для строительства петель, сравнения любого типа, а также другие инструкции, которые устанавливают код состояния, может использоваться для создания самодельные петлевые конструкции.В в приведенном ниже коде мы используем упакованную десятичную инструкцию в сочетании с ветвью для реализации счетного цикла.

СЧЕТЧИК ЗАПИСЕЙ, = P100 ПЕТЛЯ 100 РАЗ

LOOPTOP EQU *

... ПЕТЛЕВОЙ КОРПУС

SP COUNT, = P1 УКАЗАНИЕ ДЛЯ КАЖДОЙ ИТЕРАЦИИ

BNZ LOOPTOP BRANCH, ЕСЛИ НЕ НУЛЕВОЕ

В этом случае имеем решил 100 раз зациклить. Каждый раз через цикл счетчик уменьшается на 1.Мы пользуемся тем фактом, что SP устанавливает код условия на основе результата вычитание. Если результат не равен нулю, мы возвращаемся к LOOPTOP.

Создание Условные циклы

Условные циклы характеризуются тем свойством, что мы не может заранее определить количество повторений цикла. Другими словами, цикл останется выполняется до тех пор, пока не произойдет заданное условие.Состояние проверяется вручную с помощью одной из инструкций сравнения; CP для упакованных данных, CLC или CLI для символьных данных и C или CH для двоичных данных. Следующий код реализует условный цикл, который продолжается до тех пор, пока поле с именем FLAG не станет равным Y.

LOOPTOP EQU *

... ПЕТЛЕВОЙ КОРПУС

CLI FLAG, CY УСТАНОВЛЕННЫЙ ФЛАГ?

BNE LOOPTOP NO... ФИЛИАЛ НАЗАД

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

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

GETREC EQU *

ПОЛУЧИТЬ MYFILE, MYRECORD ПРОЧИТАТЬ ЗАПИСЬ

...ОБРАБОТАТЬ ЗАПИСЬ

B GETREC LOOP BACK ДЛЯ СЛЕДУЮЩЕЙ ЗАПИСИ

NEXTSTEP EQU *

На первый взгляд петля выше кажется бесконечным циклом. Другими словами, похоже, что нет логики, которая могла бы разрешить программе выходить из тела цикла после того, как он будет введен. Эта проблема решается, когда мы выполняем GET, и в файле больше нет записей. На этом этапе для NEXTSTEP возникнет ветвление, если у нас есть указан EODAD = NEXTSTEP в DCB MYFILE.Параметр EODAD вызывает безусловный переход по адресу, который мы укажите в параметре при обнаружении конца файла. Итак, на самом деле, приведенный выше цикл является условным, и продолжает выполняться до тех пор, пока не наступит конец файла.

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

Сборка петель: простая и открытая система для рекурсивного создания цепей ДНК - Pollak - 2019 - New Phytologist

Введение

Стандартизированные подходы к сборке больших ДНК сыграли важную роль в разработке систематических стратегий перепрограммирования биологических систем. Это началось с реализации методов сборки идемпотентов, основанных на расщеплении / лигировании ДНК с использованием стандартизованных сайтов вложенных эндонуклеаз рестрикции (RE), таких как метод сборки BioBrick (Knight, 2003; Shetty et al ., 2008). Совсем недавно были разработаны методы сборки, которые позволяют параллельную сборку нескольких компонентов за одну реакцию. К ним относятся методы, использующие перекрытия длинных последовательностей (Bitinaite et al ., 2007; Li & Elledge, 2007; Zhu et al ., 2007; Gibson et al ., 2009; Bryksin & Matsumura, 2010; Zhang et al ., 2012; Beyer et al ., 2015; Jin et al ., 2016), системы, основанные на рекомбинации in vivo (Ma et al ., 1987; Гибсон и др. , 2008b; Joska et al ., 2014) и Golden Gate (Engler et al ., 2008), основанные на селективном переваривании и повторном лигировании плазмидных ДНК с RE типа IIS (Sarrion-Perdigones et al . , 2011, 2013; Weber et al ., 2011; Engler et al ., 2014; Storch et al ., 2015; Iverson et al ., 2016; Moore et al ., 2016) . Тип IIS и методы на основе длинного перекрытия позволили увеличить масштаб и эффективность сборки цепи ДНК, тогда как рекомбинация in vivo остается методом выбора для манипуляций в масштабе генома (Gibson et al ., 2008а, б, 2010а; Benders et al ., 2010; Карас и др. ., 2012, 2013).

Сборка Гибсона, метод на основе перекрытия последовательностей, был разработан для синтеза и сборки геномов Mycoplasma (Гибсон и др., ., 2008a, 2010a) и позволил сборку ДНК размером до нескольких сотен килобаз (кб). в однореакторных изотермических реакциях (Гибсон и др. ., 2009). Этот метод получил широкое распространение в сообществе специалистов по синтетической биологии, поскольку он не оставляет шрамов, универсален и относительно эффективен.Однако сборка Гибсона обычно основана на использовании олигонуклеотидов для выполнения амплификации фрагментов ДНК in vitro, что может быть подвержено ошибкам (Keohavong & Thilly, 1989; Gibson et al. ., 2010b; Potapov & Ong, 2017). Этот метод также чувствителен к составу последовательностей и повторам, и, следовательно, были предприняты усилия по стандартизации и оптимизации сборки Гибсона путем включения фланкирующих уникальных нуклеотидных последовательностей (UNS), которые могут использоваться как длинные перекрытия для клонирования единиц транскрипции (TU) в более крупные конструкции (Torella et al ., 2013). Возможно, из-за гибкости сборки Гибсона на сегодняшний день не был предложен стандарт для объединения элементарных частей в TU. Лаборатории, использующие сборку Гибсона, полагаются на свой собственный набор правил и шаблонов для частей ДНК, и не было никаких усилий для разработки общего стандарта в масштабах всего сообщества.

В отличие от этого, сборочные системы типа IIS практически свободны от специальной конструкции и очень эффективны как для сборки TU, так и для сборки элементарных деталей в TU (Patron, 2016).Эти методы не требуют ПЦР-амплификации или выделения фрагментов и позволяют параллельную сборку большого количества частей ДНК (Потапов и др. ., 2018). Вместо ПЦР в этих методах используются RE типа IIS для создания фрагментов с короткими комплементарными выступами, которые можно лигировать в реакции с одним горшком. Хотя этот подход может быть безболезненным, применение стандартных выступов (сайтов слияния) для частей ДНК с определенной функцией (например, промотор, кодирующая последовательность (CDS), терминаторы) позволяет повторно собрать одни и те же части ДНК в несколько конструкций без изменения конструкции. или модификация (Энглер и др. ., 2008; Sarrion-Perdigones et al ., 2011, 2013; Вебер и др. , 2011; Лампропулос, и др., , 2013; Binder et al ., 2014). Недавно разработчики и последователи методов клонирования Type IIS предложили общий синтаксис. Этот стандарт определяет однозначное расположение 12 выступов IIS типа, которые образуют границы между функциональными доменами, обнаруженными в обобщенном гене эукариот (Patron et al ., 2015). Общий синтаксис основан на широко используемых стандартах MoClo и GoldenBraid и нашел признание в области растений (Patron et al ., 2015) и iGEM в виде стандартных деталей PhytoBricks. Общий синтаксис гарантирует, что эти системы сборки IIS типа могут иметь общий запас стандартизованных частей ДНК, которые будут совместно использоваться и использоваться в готовом виде. Установление общего стандарта для частей исходной ДНК также обеспечивает преобладающий синтаксис, который увеличивает возможность передачи и воспроизводимость для составления генетических инструкций в различных лабораториях. Сборка точной копии генетической конструкции возможна, просто зная ее состав, исключая ненужный дизайн ad hoc и позволяя простые абстрактные описания, содержащие точную подразумеваемую последовательность.Однако системы сборки IIS типа требуют рефакторинга или «одомашнивания» частей ДНК, обычно выполняемых посредством ПЦР или синтеза ДНК. Одомашнивание относится к устранению сайтов RE, присутствующих в последовательности ДНК, перед ее использованием в системе сборки. На сегодняшний день наиболее часто используемыми RE являются BsaI, BsmBI и BpiI, которые имеют сайты узнавания длиной 6 пар оснований, которые, хотя и не часто, но регулярно встречаются в последовательностях ДНК (Lin & O'Callaghan, 2018). RE типа IIS, такие как SapI и AarI, с сайтами распознавания 7 пар оснований, могут использоваться для снижения вероятности обнаружения сайтов, требующих приручения, и используются в Electra ™ (ATUM, Ньюарк, Калифорния, США) и GeneArt ™ ( ThermoFisher, Waltham, MA, USA) соответственно.Системы на основе IIS быстро нашли применение в области синтетической биологии из-за необходимости обеспечения надежности, масштабируемости и совместимости с методами автоматизированной сборки. Поскольку синтетическая биология уже находится на том этапе, когда конструкции могут состоять из нескольких логических ворот (Nielsen et al ., 2016), полных биосинтетических путей (Temme et al ., 2012) или сконструированной геномной ДНК (Richardson et al. ., 2017), надежные методы сборки, такие как сборка типа IIS, необходимы для создания генетических конструкций более высокого порядка.

Несмотря на значительный прогресс в технических аспектах построения ДНК и возможности повторного использования частей, ограничительная практика интеллектуальной собственности (ИС) и соглашения о передаче материалов (MTA) могут препятствовать совместному использованию компонентов ДНК как в государственном, так и в частном секторах, задерживая экспериментальную работу из-за оформления документов и юридическая консультация. С этой целью в настоящее время предпринимаются международные усилия по созданию OpenMTA (https://www.openmta.org) как способа ускорения обмена биологическими материалами.OpenMTA предоставляет юридический шаблон для бесплатного и неограниченного распространения материалов, обеспечивая формальный механизм для эффективного размещения материалов в общественном достоянии таким образом, который расширяет существующие практики. Открытый обмен системами сборки ДНК и частями через OpenMTA будет способствовать разработке новых решений проблем в области здоровья человека, сельского хозяйства и окружающей среды, таких как те, которые определены Организацией Объединенных Наций как Цели устойчивого развития (https: //www.un. org /ustainabledevelopment) и Global Grand Challenges Фонда Гейтса (https: // gcgh.grandchallenges.org).

Здесь мы представляем сборку петель, универсальную, простую и эффективную систему изготовления ДНК, основанную на рекурсивной сборке ДНК. Он сочетает в себе все преимущества сборки Type IIS, но требует только набора из восьми плазмид для создания конструкций теоретически неограниченной длины. Помимо сборки Type IIS, система объединяет методы сборки с длинным перекрытием. Таким образом, четыре TU могут быть собраны в несколько TU с использованием альтернативных методов, таких как сборка Гибсона через фланкирующие UNS (Torella et al ., 2013). В нашем методе сборки Type IIS выполняются с помощью повторяющихся «циклов». Предоставляются два набора из четырех плазмидных векторов, которые позволяют чередовать циклы сборки. Во-первых, части уровня 0, определенные общим синтаксисом PhytoBrick, собираются в блоки TU уровня 1 в каждом из четырех векторов с нечетными номерами с использованием BsaI. Во-вторых, четыре модуля уровня 1 могут быть затем собраны в конструкцию уровня 2 в каждом из четырех векторов с четными номерами с помощью SapI. После этого конструкции уровня 2 можно объединить путем клонирования обратно в векторы с нечетными номерами, используя BsaI, для создания сборок уровня 3, содержащих до 16 единиц каждая.Итерационный процесс комбинирования генетических модулей, по четыре за раз, можно продолжать без теоретических ограничений, чередуя этапы сборки между нечетными и четными векторами цикла. Поскольку уровни используются рекурсивно, можно создавать гибридные уровни, которые могут содержать смесь частей из разных уровней с одинаковой четностью (т. Е. Векторы уровня 2 в сочетании с элементами из векторов уровня 0). Кроме того, мы разработали LoopDesigner, программный фреймворк для in silico обработки последовательностей и проектирования сборки.Программные инструменты имеют открытый исходный код и доступны через Github , а векторы сборки Loop предоставляются через OpenMTA для неограниченного использования. Мы разработали и протестировали систему сборки Loop в разных лабораториях и предоставили данные, подтверждающие эффективность и надежность метода. Мы собрали более 200 конструкций с размером до 16 TU и размером более 38 kb. Мы протестировали петлевые конструкции в planta и подтвердили их функцию в трансгенных Marchantia polymorpha и посредством временной экспрессии в протопластах Arabidopsis thaliana .

Материалы и методы

Конструкция магистралей петлевой сборки

векторов сборки петель были сконструированы с использованием сборки Гибсона (Gibson et al ., 2009). В вектор pGreenII (Hellens et al , 2000) были внесены несколько изменений для получения основной плазмидной цепи для векторов сборки петли: сайты BsaI и SapI были удалены из плазмиды с использованием молчащих мутаций, когда это возможно. Чтобы уменьшить проблемы со стабильностью больших конструкций у бактерий (Moore et al ., 2016; Watson et al. ., 2016), два нуклеотида в ориджине репликации, происходящем из pGreenII ColEI, были мутированы, превращая его в ориджин репликации pBR322 со средним и низким числом копий. Область, простирающуюся от левого края Т-ДНК до кассеты гена устойчивости к гигромицину, заменяли последовательностью вектора pET15 (Haseloff, 1999) от терминатора nptII nosT до промотора UAS GAL4 (основания 2851–3527). Устойчивость к спектиномицину была клонирована для замены кассеты nptI, чтобы обеспечить микробный селективный маркер для плазмид pEven.UNS были клонированы в версии канамицина и спектиномицина скелета вектора после 3'-конца последовательности вектора pET15 и правой границы. Наконец, сайты ферментов рестрикции петли (BsaI и SapI), выступы и кассета lacZα были клонированы между UNS, давая векторы pOdd и pEven. Плазмиды L0, используемые для сборки IIS петлевого типа, были собраны с использованием сборки Гибсона в модифицированную плазмиду pUDP2 (BBa_P10500), которая содержала случайную последовательность из 20 п.н. (5'-TAGCCGGTCGAGTGATACACTGAAGTCTC-3 ') ниже 3'-конвергентного сайта BsaI и выше суффикс BioBrick, чтобы обеспечить негомологичные фланкирующие области для правильной ориентации во время сборки внахлест.

Спейсер для ДНК

случайных последовательностей ДНК были извлечены из генератора случайных последовательностей ДНК (https://www.faculty.ucr.edu/~mmaduro/random.htm), заказаны как фрагменты дцДНК из IDT и собраны с использованием сборки Гибсона.

Плазмиды и конструкция конструкции

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

Проектирование конструкций выполнено с помощью программного обеспечения LoopDesigner, установленного на локальной машине. Программное обеспечение было настроено для использования магистральных цепей сборки петель вместе с RE BsaI и SapI, а также выступов A – B и α – ω. Кроме того, в программное обеспечение были добавлены определения 12 типов деталей L0 на основе выступов, указанных в общем синтаксисе.Последовательности частей L0 были добавлены в базу данных LoopDesigner, присвоив один из определенных типов частей, и, следовательно, собраны в конструкции уровня 1 и уровня 2 in silico . Концентрации частей L0 и конструкций уровня 1 были скорректированы до тех, которые были предложены LoopDesigner для 10-мкл реакций.

Протокол сборки IIS типа петли

Протокол сборки IIS петлевого типа был адаптирован из Patron (2016), и его можно найти по адресу https: // www.Протоколы.io/view/loop-assembly-pyqdpvw. Аликвоту 15 фмоль каждой собираемой части смешивали с 7,5 фмоль плазмиды-приемника в конечном объеме 5 мкл с дистиллированной H 2 O (dH 2 O) (таблица S2). Реакционная смесь, содержащая 3 мкл dH 2 O, 1 мкл Т4 ДНК-лигазного буфера 10 × (№ B0202; NEB, Ипсвич, Массачусетс, США), 0,5 мкл 1 мг. -1 очищенная бычья сыворотка. альбумин (разведение 1:20 в dH 2 O BSA, степень молекулярной биологии 20 мг / мл -1 , NEB cat.B9000), 0,25 мкл ДНК-лигазы Т4 при 400 ед. Мкл -1 (NEB, кат. M0202) и 0,25 мкл соответствующего рестрикционного фермента в количестве 10 ед. Мкл -1 (BsaI NEB, кат. R0535 или SapI NEB, кат. R0569. ), был приготовлен на льду. Затем 5 мкл реакционной смеси объединяли с 5 мкл смеси ДНК для реакционного объема 10 мкл (таблица S3) с помощью пипетки и инкубировали в термоциклере с использованием программы, описанной в таблице S4. Для реакций SapI буфер ДНК-лигазы Т4 был заменен буфером CutSmart (NEB, кат. B7204S) с добавлением 1 мМ АТФ; 1 мкл реакционной смеси добавляли к 50 мкл химически компетентных клеток TOP10 (№C4040100; ThermoFisher), и после инкубации при 42 ° C в течение 30 секунд образцы оставляли на льду на 5 минут, добавляли 250 мкл Super Optimal бульона со средой для репрессии катаболита (SOC) и клетки инкубировали при 37 ° C в течение 1 часа. Наконец, 5 мкл 25 мг мл -1 5-бром-4-хлор-3-индолил-β-d-галактопиранозида (X-Gal) (№ B4252; Sigma-Aldrich), растворенного в диметилсульфоксиде (DMSO ), и клетки высевали на чашки с селективным бульоном лизогени (LB) с агаром, дополненным 1 мМ изопропил-β-d-1-тиогалактопиранозидом (IPTG) (№I6758; Сигма-Олдрич). Реакции сборки также были автоматизированы. Реакции сборки были идентичными, но были уменьшены до общего объема 1 мкл. Реакции проводили на Labcyte Echo (Сан-Хосе, Калифорния, США) в 384-луночных планшетах и ​​инкубировали на термоциклической машине в тех же условиях, что описаны выше. Реакции трансформировали в 4 мкл компетентных сверхкомпетентных клеток XL10-Gold ® (Agilent Technologies, Санта-Клара, Калифорния, США) и высевали на восьмилуночные селективные планшеты с LB-агаром.Колонии отбирали для роста в 1 мл среды в 96-луночных планшетах на платформе Hamilton STARplus ® (Reno, NV, США).

Стандартизированная ПЦР единиц транскрипции

ПЦР с использованием олигонуклеотидов UNS выполняли при температуре отжига 60 ° C с 35 циклами с использованием ДНК-полимеразы Phusion High-Fidelity (№ F-530; ThermoFisher) в реакциях объемом 50 мкл в соответствии с инструкциями производителя. Шаблон был добавлен до конечной концентрации 20 мкг мкл -1 .Фрагменты ДНК визуализировали с использованием SYBR Safe DNA Gel Stain (№ S33102; ThermoFisher) на синем светодиодном трансиллюминаторе (IORodeo, Pasadena, CA, USA). Очистку ДНК проводили с использованием набора для очистки NucleoSpin Gel и PCR Clean-up (№ 740609.250; Macherey-Nagel, Düren, Германия). Праймеры UNS, используемые при амплификации TU, перечислены в таблице S5.

Проверка путем секвенирования

Последовательности собранных плазмид были проверены путем полного секвенирования с использованием считывания парных концов из 150 пар оснований на платформе Illumina MiSeq, и их можно найти в базе данных EMBL-ENA, сгруппированной в рамках исследования PRJEB29863.Библиотеки готовили с использованием набора для подготовки библиотеки ДНК Nextera XT (№ FC-131-1096; Illumina Inc., Сан-Диего, Калифорния, США) с использованием протокола производителя, измененного на разведение один к четырем. Считанные данные были отфильтрованы и обрезаны для низкокачественных оснований и сопоставлены с плазмидами с использованием инструмента сопоставления с эталоном из программного обеспечения Geneious 8.1.8 (https://www.geneious.com; Kearse et al ., 2012), с стандартные параметры. Верность последовательности определялась вручную.

Опосредованная Agrobacterium Marchantia трансформация

Опосредованную Agrobacterium трансформацию проводили, как описано ранее (Ishizaki et al ., 2008), за следующими исключениями: для каждой трансформации использовали половину спорангия, несущего архегонии (споровую головку). Высушенные споровые головки измельчали ​​в пробирке Falcon на 50 мл с пробиркой Falcon на 15 мл и ресуспендировали в 1 мл воды на каждую споровую головку. Ресуспендированные споры фильтровали через сито 40 мкм (№ 352340; Corning Inc., Нью-Йорк, США), аликвотировали 1 мл суспензии в 1,5-мл пробирку Эппендорфа и центрифугировали при 13000 g в течение 1 мин. при комнатной температуре. Супернатант отбрасывали, споры ресуспендировали в 1 мл стерилизационного раствора и инкубировали при комнатной температуре в течение 20 мин при 150 об / мин на орбитальном шейкере.Стерилизационный раствор готовили растворением одной мини-стерилизующей таблетки Milton (Milton Pharmaceutical UK, Cheltenham, UK, активный ингредиент, дихлоризоцианурат натрия CAS: 2893-78-9: 19,5% по весу) в 25 мл стерильной воды. Образцы центрифугировали при 13 000 g в течение 1 мин, один раз промывали стерильной водой и ресуспендировали в 100 мкл стерильной воды на каждую использованную головку спор. Сто микролитров стерилизованных спор высевали на чашки с агаром Gamborg B5 1% (мас. / Об.) Половинной крепости и выращивали при постоянном флуоресцентном освещении (фотоны 50-60 моль м -2 с -1 ) вверх ногами в течение 5 d до совместного выращивания.Спорелинги совместно культивировали с ранее трансформированными и индуцированными Agrobacterium GV2260, трансформированными плазмидой pSoup (Hellens et al. ., 2000), в колбах на 250 мл, содержащих 25 мл среды Gamborg's B5 половинной концентрации с добавлением 5% (масс. / об) сахароза, 0,1% (мас. / об.) NZ-амин A (Sigma cat. C7290), 0,03% (мас. / об.) L-глутамин (Sigma cat. G8540) и 100 мкМ ацетосирингон (Sigma-Aldrich cat. D134406) в течение 36 ч, до промывки и посева на селективную среду.

Лазерная сканирующая конфокальная микроскопия

Предметное стекло микроскопа было снабжено рамкой для генов объемом 65 мкл (ThermoFisher cat.AB0577) и 65 мкл dH 2 O помещали в центр. Marchantia gemmae осторожно наносили на каплю dH 2 O, используя небольшую инокуляционную петлю, и покровное стекло №0 прикрепляли к генной рамке. Предметные стекла исследовали на платформе конфокального микроскопа Leica, Вецлар, Германия TCS SP8, оснащенной лазером белого света (WLL). Визуализация проводилась с использованием воздушного объектива Leica HC PL APO 20 × CS2 с режимом последовательного сканирования с длинами волн лазера 405, 488 и 515 нм, улавливая излучаемую флуоресценцию в окнах 450–482, 492–512 и 520–550 нм. соответственно в каждом последовательном сканировании.Z-стеки собирали каждые 5 мкм для полного диапазона объемов, а проекции максимальной интенсивности обрабатывали с помощью программного обеспечения ImageJ. Просачивание флуоресценции из синего псевдоокрашенного канала (локализованный на мембране усиленный зеленый флуоресцентный белок (eGFP)) в зеленый псевдоокрашенный канал (ядерно-локализованная Венера) было устранено с помощью пользовательских скриптов Python , которые вычитали 20% значения пикселей, присутствующих в синий канал к зеленому каналу. Изображения были отредактированы для масштабирования интенсивности пикселей до полного 8-битного диапазона, и объединенное изображение было обработано.

Временная экспрессия в протопластах мезофилла Arabidopsis

Хорошо разросшиеся листья 3-4-недельных растений Arabidopsis (Columbia-0) использовали для трансфекции протопластов. Растения выращивали при 22 ° C в условиях низкой освещенности (75 мкмоль м -2 с -1 ) и короткого фотопериода (12 ч: 12 ч, свет: темнота). Протопласты выделяли и трансфицировали полиэтиленгликолем (ПЭГ) согласно Yoo et al . (2007). Для трансфекции 6 мкл плазмид Loop L2 (2 мкг мкл -1 ), выделенных с помощью набора для очистки NucleoBond Xtra Midi / Maxi (Macherey-Nagel cat.740410.50). Трансфицированные протопласты инкубировали в течение 12 ч на свету, а затем визуализировали с помощью эпифлуоресцентной микроскопии в камере Нойбауэра (Hirschmann Laborgeräte, Эберштадт, Германия).

Эпифлуоресцентная микроскопия

Трансфицированные протопласты визуализировали с помощью микроскопа Nikon Ni (Минато, Токио, Япония), оснащенного 49021 ET - EBFP2 / кумарин / аттенуированный DAPI (возбуждение, 405/20 нм; дихроичный, 425 нм; испускание, 460/50 нм), 96227 AT-EYFP (возбуждение, 495/20 нм; дихроичный, 515 нм; излучение, 540/30 нм), 96223 AT-ECFP / C (возбуждение, 495/20 нм; дихроичный, 515 нм; излучение, 540/30 нм) и 96312 G-2E / C (возбуждение, 540/20 нм; дихроичный, 565 нм; испускание, 620/60 нм) кубиков фильтра.

LoopDesigner

Чтобы реализовать объектно-ориентированную модель для сборки Loop, мы создали библиотеку PartsDB (https://github.com/HaseloffLab/PartsDB) для определения нескольких взаимосвязанных классов, каждый из которых связан с таблицей в реляционном SQL. база данных. Структура LoopDesigner построена вокруг класса Part , который представляет либо упорядоченный набор дочерних частей, из которых он собран, либо последовательность ДНК в случае частей L0.Таким образом, мы гарантируем, что фактическая последовательность ДНК сохраняется только один раз, а последовательности частей L1 и выше создаются по запросу из реляционных связей. Кроме того, каждая часть Part связана с одним из экземпляров Backbone , который вместе с последовательностью Part представляет собой полную плазмиду сборки петли. Каждый экземпляр класса Backbone представляет собой комбинацию базовой последовательности и донорного сайта рестрикционного фермента , например, pOdd 1-4 и pEven 1-4 являются экземплярами Backbone в схеме, описанной в этой статье. .Последовательность оснований представляет собой тип плазмиды-приемника, например pOdd и pEven, и состоит из последовательности ДНК плазмиды и экземпляра сайта рестрикционного фермента-приемника . Наконец, класс Restriction Enzyme Site состоит из экземпляра Restriction Enzyme , который хранит последовательность распознавания рестрикционного фермента, и пары выступающих последовательностей, которые могут быть либо приемными, либо донорскими выступами.

Результаты

Петля в сборе

Набор для сборки Loop состоит из двух наборов плазмид, которые участвуют в циклическом процессе сборки.RE типа IIS, BsaI и SapI, используются поочередно для рекурсивной сборки генетических модулей в квартет нечетных (L1, L3,…) или четных (L2, L4,…) плазмид-приемников. На каждом этапе сборки «петли» четыре генетических модуля объединяются в плазмиду-приемник (рис. 1а). Плазмиды четного и нечетного уровней используют чередующиеся типы отбора антибиотиков, устойчивость к канамицину для нечетных уровней (плазмиды pOdd) и устойчивость к спектиномицину для четных уровней (плазмиды pEven), чтобы можно было использовать реакцию сборки переваривания-лигирования в одном горшке (Engler et al. al ., 2008). На каждом уровне (кроме сборки TU из частей L0) необходимы четыре родительских плазмиды, что приводит к экспоненциальному увеличению количества TU в четыре раза на уровень (Fig. 1b).

Обзор сборки петли. (а) Рабочий процесс сборки петли. Части L0 собираются в единицы транскрипции L1 (TU) в один приемник pOdd посредством BsaI-опосредованной сборки IIS типа. L1 TU собираются в L2 multi-TU в один приемник pEven посредством SapI-опосредованной сборки IIS типа.Затем этот рабочий процесс повторяется для сборок более высокого уровня. Для сборки петли требуются только четыре плазмиды-приемника нечетного уровня и четыре четных уровня. (б) Комбинаторно-экспоненциальная сборка. Детали L0 могут быть собраны в блоки L1 TU в любом из четырех положений нечетных приемников. Генетические модули можно легко поменять местами в каждой конфигурации TU и положении приемника. Затем блоки L1 TU могут быть собраны в блоки L2 с несколькими блоками TU с переменными комбинациями блоков L1 TU, а также в любую из четырех позиций четных приемников.Каждый раунд сборки генерирует четыре собранные плазмиды, и последующие раунды сборки увеличивают количество TU в четыре раза, что приводит к экспоненциальному увеличению количества TU.

Плазмиды в сборке петли действуют как доноры и получатели из-за особого расположения сайтов RE. Нечетные плазмиды-приемники содержат пару расходящихся сайтов BsaI, которые удаляются в реакции клонирования, тогда как пара конвергентных сайтов SapI, фланкирующих сайты BsaI, позволяет нечетным плазмидам действовать как доноры для сборки на следующем уровне.Сходным образом четные плазмиды содержат пару расходящихся сайтов SapI, фланкированных конвергентными сайтами BsaI (Fig. 2a). При переваривании донорные плазмиды высвобождают фрагменты ДНК (между конвергентными сайтами RE) со специфическими выступами, которые определяют направление и положение в сборке, тогда как плазмиды-приемники высвобождают дивергентные сайты RE, позволяющие сборку донорных фрагментов.

Схема сборки петли. (а) Петлевые приемные плазмиды. Каждая из четырех плазмид-приемников pOdd и pEven имеет определенный набор конвергентных выступов SapI (3 п.н.) и BsaI (4 п.н.), соответственно, необходимых для сборки более высокого уровня.Нечетные приемники содержат расходящиеся сайты рестрикции BsaI и концевые выступы в соответствии с общим синтаксисом, что делает их совместимыми для клонирования частей L0 в плазмиды pOdd. Они содержат конвергентные сайты SapI с донорскими выступами для направления сборки IIS типа, опосредованной SapI, в приемники четного уровня. Плазмиды pEven имеют сайты рестрикции, расходящиеся по SapI, и концевые выступы для получения частей из плазмид pOdd. Для сборок более высокого уровня плазмиды pEven содержат конвергентные сайты BsaI с донорскими выступами для BsaI-опосредованной сборки IIS типа в плазмиды pOdd.(b) Узел нечетного уровня петли. Части L0 ДНК, содержащие выступы, определенные в общем синтаксисе, собираются в приемник нечетного уровня Loop. Расщепление BsaI высвобождает модули ДНК, которые собираются в приемник с ровным уровнем путем направленной сборки, определяемой выступами из 4 пар оснований. Плазмиды pOdd содержат выступы A и F в качестве концевых выступов для принимающих частей, которые фланкированы конвергентными сайтами рестрикции SapI с донорскими выступами из 3 пар оснований для дальнейшей сборки. (c) Сборка петли ровного уровня. Четыре ранее собранные единицы транскрипции pL1 (TU) собираются в плазмиду pEven.Расщепление SapI высвобождает TU из плазмид pL1, которые собираются в приемник четного уровня путем направленной сборки, определяемой выступами из 3 пар оснований. Плазмиды pEven содержат α- и ω-выступы в качестве концевых выступов, которые фланкируются конвергентными сайтами рестрикции BsaI с донорскими выступами, определенными в общем синтаксисе, необходимом для дальнейшей сборки.

Выступы, создаваемые обработкой BsaI нечетных приемников, позволяют создавать ЕП из любых частей, совместимых со стандартом PhytoBrick (Patron et al ., 2015), такие как части L0, полученные из библиотек плазмид MoClo и GoldenBraid (если они не содержат сайтов SapI). Последовательности выступа BsaI обозначены как A, B, C, E и F, причем A и F обозначены как фланкирующие концевые выступы, а последовательности выступа SapI обозначены как α, β, γ, ε и ω, причем α и ω обозначены как фланкирующие концевые выступы. . Примеры сборок четных и нечетных уровней показаны на (рис. 2б, в).

Каждая реакция требует четырех донорских плазмид (или спейсеров ДНК) для успешной сборки в приемник следующего уровня.Чтобы обеспечить замену сборкам с менее чем четырьмя фрагментами, мы разработали «универсальные спейсерные» части длиной 200 п.н., содержащие случайную последовательность ДНК, свободную от сайтов BsaI и SapI. Плазмиды, содержащие спейсеры с фланкирующими концевыми выступами, предусмотрены для нечетных (pOdd-spacer) и четных (pEven-spacer) уровней. Их можно использовать для прямой сборки в любую из четырех плазмид-приемников соответствующего уровня (рис. S1).

Сборка синтетических промоторов

Рекурсивный характер сборки Loop позволяет смешивать части с разных уровней, но с одинаковой четностью.Например, мультимерный промотор может быть сконструирован из элементарных частей посредством рекурсивной сборки. На рисунке 3 показано создание синтетических промоторов путем клонирования функциональных доменов L0 (например, сайтов распознавания фактора транскрипции (TF) и минимальных последовательностей промотора) с фланкирующими концевыми выступами в конкретные положения плазмиды L1, которые определяют порядок расположения мотивов в следующей сборке L2. Различные сайты узнавания TF могут использоваться в положениях 1 (выступы α и β), 2 (выступы β и γ) и 3 (выступы γ и ε), тогда как минимальная последовательность промотора помещается в положение 4 (выступы ε и ω) Плазмиды-ресиверы L1.Затем эти элементы могут быть составлены в определенном порядке. В этом примере различные комбинации сайтов связывания TF и ​​минимального промотора клонировали в положения 1 (выступы A и B) и 2 (выступы B и C) плазмид-приемников L2. Полученные составные промоторные элементы могут быть смешаны со стандартными частями гена L0 для создания индивидуализированной сборки гибридного гена в плазмиде нечетного уровня (рис. 3а).

Гибридная сборка. (а) Сборка синтетического промотора.Функциональные домены L0, окруженные концевыми выступами, собираются в приемники нечетного уровня в любом заданном положении. Мотивы L1 затем собираются в композиты L2 с различным расположением в положениях 1 и 2. Композиты L2 в положениях 1 и 2 используются в гибридной сборке с частями L0 для создания гибридной единицы транскрипции нечетного уровня (TU) с синтетическим промотором, состоящим из функциональные области L0 в определенном порядке. (б) Сборка смешанного уровня. Части L3 и L1 собираются в приемник четного уровня, генерирующий гибридную плазмиду с несколькими TU четного уровня.

Используя этот подход, мы собрали три флуоресцентных репортера с синтетическими промоторами, содержащими мультимерные сайты связывания. Промоторы включали связывающие домены для дрожжевых TF GAL4 (Guarente et al ., 1982; West et al ., 1984; Giniger et al ., 1985) и HAP1 (Zhang & Guarente, 1994), цитокинин (CK) (Müller & Sheen, 2008) и производное промотора 35S вируса мозаики цветной капусты (CaMV) (Benfey & Chua, 1990) (F.Federici и J. Haseloff, неопубликованные результаты), управляя флуоресцентным белком Венеры (Nagai et al ., 2002). Полученные репортеры состояли из одних и тех же элементов, но с различным расположением мотивов, содержащих 13 нуклеотидных рубцов между мотивами. Каждый репортер содержал три димерных связывающих домена для GAL4, три димерных связывающих домена для HAP1, один связывающий домен димерного оператора CK и минимальный промотор 35S CaMV (см. Примечания S1). Составные синтетические промоторы, которые были результатом 20 различных реакций сборки, были проверены путем секвенирования и не показали ошибок последовательности.Последовательности окончательных конструкций (pL3-1_PC1, pL3-1_PC2 и pL3-1_PC3) можно найти во вспомогательной информации.

Рекурсивный характер сборки петель также делает возможным гибридные сборки нескольких TU, полученных из донорских плазмид с разных уровней (т. Е. Трех плазмид уровня 1 и одной плазмиды уровня 3). Они могут быть собраны в гибридную плазмиду-приемник, что обеспечивает дополнительную гибкость при изготовлении генетических конструкций (рис. 3b).

UNS для стандартной сборки внахлест

Помимо возможности сборки типа IIS, векторы цикла были разработаны для методов сборки с длинным перекрытием.Петлевые плазмиды содержат UNS, которые позволяют использовать стандартные праймеры для амплификации TU, полученных из частей ДНК типа IIS (PhytoBricks, MoClo и GoldenBraid), поскольку они могут быть собраны в UNS-фланкированные TU посредством BsaI-опосредованной сборки IIS типа. Альтернативно, TU могут быть собраны из фрагментов ПЦР или синтеза ДНК в петлевые плазмиды с помощью методов перекрывающейся сборки, таких как сборка Гибсона (фиг. 4a). Каждая петлевая плазмида содержит два фланкирующих UNS и концевой UNS x . TU могут быть собраны в целевую плазмиду с несколькими TU (pUNSDest) с использованием методов перекрывающейся сборки (рис.4б). UNS были разработаны в соответствии с рядом рекомендаций, чтобы обеспечить повышенную производительность при PCR и сборке с перекрытием. Правила проектирования перечислены в методах S1, а их последовательность - в таблице S6. Прямые и обратные стандартные праймеры соответствуют первым 20 п.н. каждого UNS как в прямой, так и в обратной ориентации комплемента, соответственно, и представлены в таблице S5. Преимущество UNS в том, что они разработаны для высокоэффективной ПЦР в стандартных условиях (60 ° C, 35 циклов), что приводит к получению одиночных ампликонов с высокими выходами (рис.S2). Это устраняет необходимость очистки геля во время рабочего процесса сборки Гибсона, если выполняется соответствующая очистка на колонке.

Узел перекрытия петли. (a) Блок транскрипции (TU) для сборки внахлест. Единицы транскрипции (TU), фланкированные уникальной нуклеотидной последовательностью (UNS), могут быть получены либо стандартным L0 BsaI-опосредованным сборкой типа IIS, либо методами перекрывающейся сборки с использованием фрагментов ПЦР или синтеза ДНК. TU, полученные сборкой внахлест, совместимы только с путем сборки внахлест, но не требуют одомашнивания.(b) Стандартизированная сборка внахлест. Линейные TU, фланкированные UNS, амплифицируются с помощью ПЦР или вырезаются из плазмид путем расщепления редкими рестрикционными ферментами. Затем линейные UNS-фланкированные TU собираются в плазмиду-адресат pUNSDest с помощью методов перекрывающейся сборки.

Надежность сборки петли

Чтобы оценить надежность метода, мы протестировали сборки L1 Type IIS Loop в разных лабораториях и получили согласованные результаты (Таблица 1).Мы собрали более 200 плазмид, используя путь типа IIS для уровней 1-3, и получили среднюю эффективность сборки от 83% до 97%, в зависимости от уровня сборки и сложности конструкций (таблица 1; примечания S2). Это было оценено посредством профилирования ДНК с помощью переваривания RE (рис. S3). Кроме того, мы выполнили Illumina секвенирование 92 собранных конструкций уровня 2 и уровня 3, чтобы проверить точность сборки петли на уровне последовательности, чтобы определить, произвела ли реакция правильные сборки и были ли внесены мутации с помощью нашего метода.Мы обнаружили, что 95,4% конструкций собраны правильно с 98,8% рубцов нависания, присутствующих в ожидаемых местах соединения. В целом, 99,8% нуклеотидов были правильно собраны, и несколько неправильных конструкций показали недостающие области в результате неправильной сборки, а не ошибки последовательности как таковые (Таблица S7).

Таблица 1. Эффективность сборки петли
Уровень Конструкции (нет.) ТУ (№) Средняя длина (п.н.) Общий КПД * (%) Средняя эффективность † (%)
Лаборатория 1
L1 104 1 6243 96 97
L2 79 4 13 519 82 88
L3 23 16 26 731 81 83
Гибрид 3 Var. 5473 100 100
Лаборатория 2
L1 14 1 5570 91 91
UNS перекрытие 5 4 12 548 71 71
  • * Общая эффективность рассчитывается как общее количество образцов с правильными шаблонами рестрикционного анализа (RD) по общему количеству протестированных образцов.
  • † Средняя эффективность рассчитывается как среднее значение правильных шаблонов RD по количеству образцов, протестированных на конструкцию.
  • ТУ - единица транскрипции; UNS, уникальная нуклеотидная последовательность.

In planta Активность петлевых плазмид

петлевых векторов были получены из pGreenII (Hellens et al ., 2000) вектор бинарной трансформации растений, но отделенный от маркеров селекции растений (см. Раздел «Материалы и методы»), чтобы обеспечить их введение во время сборки. Как и в pGreenII, петлевые плазмиды содержат элементы для размножения в Agrobacterium tumefaciens и способны к трансформации растений, опосредованной Agrobacterium . Мы протестировали применение конструкций Loop в биологии развития растений путем сборки TU, состоящих из флуоресцентных белков, тегов локализации и эндогенных промоторов.Это позволило нам выделить клеточные особенности и отследить паттерны экспрессии гена в planta . Конструкция уровня 2 (pL2-1_TPL), содержащая четыре TU, состоящих из селектируемого маркера HygR, репортера mTurquoise2-N7 с ядерной локализацией, управляемого конститутивным промотором Mp EF1 α (Nagaya et al ., 2011; Althoff et al. al ., 2014), репортер Venus-N7 с ядерной локализацией, управляемый тканеспецифическим промотором Mp TPL (Flores-Sandoval et al ., 2015) и локализованный на мембране маркер eGFP-Lti6b, управляемый промотором Mp EF1 α, собирали из частей L0 (Таблица S1) с использованием сборки петли и трансформировали в Marchantia polymorpha (Marchantia). Были получены регенерированные трансформанты, и клональные пропагулы, названные gemmae , были исследованы с помощью конфокальной микроскопии. Все три репортерных гена флуоресцентных белков были экспрессированы и позволили визуализировать различные клеточные и субклеточные особенности в ткани (рис.5).

In planta - активность сборочной конструкции Loop. Marchantia gemmae , трансформированная конструкцией L2, была визуализирована с помощью лазерного сканирующего конфокального микроскопа Leica SP8 для оценки экспрессии флуоресцентных маркеров. mTurquoise2-N7, Venus-N7 и eGFP-Lti6b возбуждали соответствующими длинами волн, и флуоресценция регистрировалась в их соответствующих окнах излучения в режиме последовательного сканирования. Показанные изображения представляют собой проекции максимальной интенсивности Z-стека.

Кроме того, четыре TU L1, которые были сконструированы сборкой петли типа IIS, были собраны в целевую плазмиду с несколькими TU с использованием сборки Гибсона. Трансфицированные протопласты показали экспрессию сконструированных флуоресцентных репортеров в их ожидаемых локализациях (рис. S4), обеспечивая быструю и эффективную систему для оценки функциональности конструкций Loop. Карты плазмид для конструкций представлены на рис. S5.

Автоматизация конструирования узлов петель

Мы разработали программные инструменты, помогающие проводить эксперименты по сборке петель.Мы разработали LoopDesigner, веб-приложение, которое облегчает: (1) проектирование последовательности и одомашнивание частей ДНК уровня 0; (2) создание базы данных деталей сборки Loop; и (3) моделирование реакций сборки петли и полученных плазмидных карт и последовательностей (рис. 6). Входные последовательности L0 приручены путем идентификации нежелательных сайтов RE и их удаления путем введения синонимичных мутаций. Соответствующие выступы BsaI добавляются в соответствии с правилами общего синтаксиса для частей ДНК и сохраняются в базе данных частей.(Подробное описание реализации LoopDesigner см. В разделе «Материалы и методы».) Мы приглашаем читателей посетить веб-инструмент LoopDesigner, доступный по адресу loopdesigner.herokuapp.com (поддерживаемый в Google Chrome), для изучения методов сборки Loop. Исходный код LoopDesigner доступен по адресу GitHub (https://github.com/HaseloffLab/LoopDB LoopDesigner Branch) и предоставляется по лицензии Массачусетского технологического института (MIT).

Автоматизация проектирования.Последовательность ДНК отправляется в LoopDesigner, который проверяет сайты BsaI и SapI и по возможности приучает их к молчащим мутациям. Деталь Тип указывается для схемы сборки, чтобы сохранить деталь в библиотеке базы данных. Для выполнения сборки in silico выбирается плазмида-приемник, которая отображает совместимые части , которые могут быть размещены в текущей позиции схемы сборки. Поскольку включены частей , отображаются следующие совместимые частей .Когда схема сборки обнаруживает, что выбраны все детали , необходимые для завершения сборки, выполняется моделирование сборки. Затем LoopDesigner выводит результирующую карту плазмиды с ее параллельной выделенной последовательностью и протокол для настройки реакции IIS петлевого типа или экспорта последовательности GenBank. Инструкции для роботов могут быть выведены, если API предоставлен с необходимой информацией (положения плазмид, сопоставления идентификаторов, функции роботов) для создания файла параллельных инструкций с использованием сценариев Python .Собранная деталь затем сохраняется в базе данных библиотеки деталь для дальнейшей сборки.

Обсуждение

Дизайн сборки Loop был вдохновлен существующими методами сборки, такими как GoldenBraid, MoClo и стандартизированная сборка Gibson. Мы попытались интегрировать эти методы в универсальную систему сборки ДНК. Сборка петли сочетает в себе рекурсивное использование двух рестрикционных ферментов и наборов плазмид, которые вместе создают простую и универсальную платформу сборки IIS типа.Сайты типа IIS RE используются в конфигурациях «голова к голове», что устраняет необходимость в оконечных линкерах, используемых в системах MoClo. Вместо этого сайты рестрикции для последовательных уровней интегрируются в плазмиды-приемники, как в GoldenBraid, но с использованием четности четности сборки вместо двоичной. Это позволяет ускорить сборку больших конструкций, но требует, чтобы все четыре позиции были заполнены либо TU, либо прокладками. Фиксирование количества частей донора позволяет систематизировать без увеличения сложности сборки, со стандартизованными реакциями, содержащими определенное количество частей ДНК и выступов.Кроме того, рекурсивный характер сборки Loop позволяет использовать компактную библиотеку плазмид, обеспечивая при этом универсальные стратегии построения. Мы показываем использование рекурсивной сборки для изготовления сложной ДНК, такой как синтетические промоторы, состоящие из повторяющихся последовательностей и гибридных уровней. Сайты рестрикции IIS типа в петлевых векторах фланкируются стандартизованными UNS, что позволяет использовать петлевые векторы с перекрывающимися методами сборки и повторно использовать олигонуклеотиды для сборки. Это дает пользователям Гибсона и перекрывающихся методов сборки возможность подключаться к уже доступным библиотекам одомашненных частей ДНК.Мы продемонстрировали высокую эффективность сборки Loop, создав различные конструкции с разным количеством TU, обеспечивая надежную сборку конструкций до 16 TU, состоящих из 56 отдельных частей. Кроме того, мы использовали сборку петли для создания мультиспектральных репортерных конструкций и показали их активность in planta .

Использование и характеристика продуктов сборки Loop демонстрирует, что это прочная и надежная система сборки ДНК независимо от уровней и типов деталей.Сборки петель различались по размеру, общему количеству фрагментов и составу ДНК, чтобы обеспечить точную оценку эффективности метода при повседневном использовании. Высокий уровень успешных сборок, даже в отсутствие предварительного отбора cPCR, значительно снижает усилия и время, необходимые для конструирования ДНК. Кроме того, система использует преимущества (1) общего синтаксиса для частей ДНК, (2) простой рекурсивной схемы сборки, (3) небольшого набора плазмидных векторов и (4) оптимизированных протоколов, чтобы обеспечить оптимизированную и логическую структуру. для сборки, которая обеспечит быстрое внедрение студентами и неспециалистами.Поскольку сборка Loop объединяет тип IIS и сборку с перекрытием, она стимулирует развитие сообщества вокруг системы построения ДНК, приводя к растущей коллекции частей и композитов ДНК. Широкая совместимость сборки Loop способствует надлежащему курированию и совершенствованию коллекций частей ДНК за счет сотрудничества, упрощения обмена и передачи генетических модулей между лабораториями, а также перекрестной проверки. Возможность использовать либо перекрытие, либо сборку типа IIS обеспечивает дополнительную гибкость в создании конструкций ДНК, в которых изменения последовательности, вносимые удалением незаконных сайтов RE, нежелательны (например, для экспериментов с использованием нативных генетических последовательностей), или когда сборка не удается из-за одного путей.

Хотя падающая стоимость синтеза ДНК предполагает, что синтез ДНК транскрипционных единиц или даже хромосом может в конечном итоге быть экономичным по времени и затратам, синтетическая биология требует способности для быстрых, высокопроизводительных и комбинаторных сборок. Это необходимо для характеристики и устранения неполадок более мелких частей и цепей ДНК перед компиляцией устройств и систем высокого уровня. Сборочные системы, которые предназначены для использования возможностей, предоставляемых технологиями автоматизации, несомненно, выиграют от робототехнических платформ.Платформы автоматизированного проектирования и обработки жидкостей для изготовления конструкций ДНК уже приняты некоторыми, и технологии быстро расширяются: на верхнем сегменте рынка такие платформы, как Echo (Labcyte), позволяют миниатюризировать и увеличивать производительность, давая существенное снижение затрат на реакцию (Kanigowska et al ., 2016), в то время как недорогие платформы, такие как OT-One S (OpenTrons), стремятся сделать автоматическое дозирование доступным в каждой лаборатории.

Чтобы облегчить проектирование конструкций, мы разработали LoopDesigner, программную среду, которая обеспечивает интерфейс между цифровым дизайном и экспериментами. Мы продемонстрировали полезность LoopDesigner, реализовав простой веб-инструмент, с помощью которого пользователи могут разрабатывать стратегию сборки и запускать виртуальные реакции перед тем, как отправиться в лабораторию. Платформа LoopDesigner позволяет определять схемы сборки Loop произвольной сложности с любым количеством уровней и плазмид на уровень, а также с любыми возможными ферментами рестрикции и выступами.В этом смысле LoopDesigner обобщает концепцию сборки, так что схема сборки, представленная в этой статье, становится единственным экземпляром многих возможных реализаций сборки Loop, что позволяет исследовать новые способы сборки частей ДНК с помощью стратегий типа IIS.

Конструирование ДНК

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

До недавнего времени обмен большинством материалов для исследований осуществлялся в соответствии с Единым соглашением о передаче биологических материалов (UB-MTA). Это двустороннее юридическое соглашение, которое в своей стандартной форме не допускает распространения, обмена или использования с другими организациями за пределами образовательных и исследовательских организаций. В то же время в научных публикациях и программном обеспечении наблюдается тенденция к открытости для облегчения сотрудничества и перевода результатов фундаментальных исследований. Отличный пример того, как философия открытого исходного кода способствовала инновациям, - это проекты кодирования, основанные на сообществе, такие как проекты, размещенные на Github (https: // github.com). Git изначально разрабатывался для распределенной разработки программного обеспечения, и в настоящее время большинство совместных проектов, как в государственном, так и в частном секторе, используют Git в качестве базовой платформы. Маловероятно, что мы увидим аналогичный успех в ДНК-инженерии и синтетической биологии, если новые формы неограниченного совместного использования и сборки ДНК не будут созданы в рамках более открытых структур, таких как OpenMTA. Мы поддерживаем внедрение обмена элементарными деталями L0 с открытым исходным кодом, предоставляя сборку Loop для построения более высокого уровня этих компонентов L0 в рамках OpenMTA.Работа по созданию OpenMTA обеспечит доступ к системе сборки Loop для работы как в государственном, так и в частном секторе.

Благодарности

Мы хотели бы поблагодарить Диего Орзаэса (Instituto de Biología Molecular y Celular de Plantas) за полезные предложения и советы относительно рестрикционных ферментов SapI и типа IIS, Олега Райцкина (Институт Эрлхэма) за совет по протоколам сборки типа IIS, Х. Гариба (Геттинген) Университета), Т.WJ Gadella и J. Goedhart (оба Амстердамского университета) за предоставление ДНК mTurquoise2, Джен Шин (Гарвардский университет) за предоставление ДНК промотора TCS, Тева Верно (Ecole Normale Supérieure de Lyon) для ДНК Венеры N7, Джеффа Лихтмана (Гарвардский университет) за mTagBFP2 DNA, а также Susana Sauret-Gueto, Eftychis Frangedakis и Marta Tomaselli (все Кембриджский университет) за устранение неполадок с реакциями SapI. Мы благодарим Линду Кал и Дрю Энди (BioBricks Foundation) за обсуждение реализации OpenMTA.Поддержку авторам оказали Becas Chile и Cambridge Trust (для BP), программа BBSRC DTP (для MD) Кембриджского университета, Исследовательский совет биотехнологии и биологических наук (BBSRC) и Исследовательский совет по инженерным и физическим наукам (OpenPlant Grant No. .BB / L014130 / 1) (для NJP, FF и JH). Автоматизация лабораторий, секвенирование нового поколения и создание библиотек осуществлялись через BBSRC National Capability in Genomics (BB / CCG1720 / 1) в Институте Эрлхэма. FF выражает благодарность за финансирование от CONICYT Fondecyt Iniciación 11140776.FF и RAG выражают признательность за финансирование Центру регулирования генома Fondo de Desarrollo de Areas Prioritarias (FONDAP) (150) и Instituto Milenio iBio - Iniciativa Científica Milenio MINECON. Авторы заявляют, что у них нет конкурирующих финансовых интересов.

    Вклад авторов

    Авторы исследования -

    BP, FF и JH. BP и FF разработали логику сборки Loop. Компания BP разработала и реализовала схему сборки Loop, построила библиотеку сборки Loop, оптимизировала условия реакции, проверила рекурсивную сборку и провела характеристику эффективности сборки Loop.BP и MD построили сборочные конструкции Loop. TM, SA и FF разработали UNS для растений. SA провела предварительные эксперименты для проверки сборки, опосредованной UNS. AC собранная петля конструирует посредством сборки перекрытия UNS и собирает данные экспрессии на протопластах Arabidopsis thaliana . MD и BP разработали LoopDesigner, а MD разработали PartsDB и LoopDesigner. AW выполнил HT-секвенирование сборочных конструкций Loop. NJP предоставил рекомендации относительно эндонуклеаз рестрикции типа IIS.BP выполнила работу Marchantia и собрала данные микроскопии. FF и JH руководили проектом. FF, RAG и JH обеспечили финансирование для развития проекта. Рукопись написали BP, MD, RAG, NJP, FF и JH. Все авторы отредактировали рукопись.

    Язык ассемблера: aarch64 & x_86 Loops

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

    До начала моего курса по переносимости и оптимизации программного обеспечения я изучал и экспериментировал только с языками программирования высокого уровня, такими как C, C ++ и Java. Опираясь на основы каждого языка, я никогда особо не задумывался о том, как компьютер интерпретирует каждую строку кода. Для меня компилятор был тем инструментом, который автоматически объединял мой исходный код и создавал работающую программу.

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

    Например, если вы когда-либо работали с компилятором gcc, после успешной компиляции вам будет предоставлен исполняемый двоичный файл. По умолчанию обычно называется a.out . Если открыть этот файл, вы увидите набор искаженных символов.Двоичные файлы не предназначены для чтения людьми.

    Чтобы скрыть двоичный файл, мы можем использовать инструмент CL objdump -d . Когда мы анализируем двоичный файл, мы можем исследовать этот набор инструкций ассемблера конкретной машины.

    Язык ассемблера, выглядит страшновато, но… никаких «но». Это страшно.

    Вы не можете позволить себе роскошь работать со специализированными IDE и инструментами автозавершения кода. Хочу простую программу «Hell0 W0rld». Будьте готовы написать 50 сборочных строк.
    Помимо шуток, лабораторная работа на этой неделе была разработана, чтобы показать нам, как проектируются архитектуры aarch64 и x86_64 путем создания простых приложений для каждой системы.

    Цель этой лабораторной работы - реализовать простой цикл C, написанный на языке ассемблера x86_64 и aarch64. Нам был предоставлен пустой блок цикла x86_64 (см. Ниже), который выполняет цикл от 0 до 9, используя r15 в качестве счетчика индекса (управления циклом).

    Желаемый результат

      Шлейф: 0
    Петля: 1
    Петля: 2
    Петля: 3
    Петля: 4
    Петля: 5
    Петля: 6
    Петля: 7
    Петля: 8
    Петля: 9
      

    Блок пустого контура

    x_86_64 & aarch64 Циклы
    Ресурсы

    Цель состояла в том, чтобы отображать простое текстовое сообщение для каждой итерации цикла с текущим номером индекса.
    Чтобы избежать прокрутки вперед и назад между объяснением и кодом, я добавил комментарии в суть, чтобы объяснить свои решения вместе с результатами objdump -d .

    x86_64 Решение 9 итерационного цикла

    Хотя сборка aarch64 имеет другой синтаксис, чем ее аналог x86_64, они все же имеют сходство в логике.

    aarch64 Решение 9 итерационного цикла

    Чтобы продолжить наш предыдущий цикл из 9 итераций, нам было поручено увеличить счетчик до 30.Звучит достаточно просто. Просто увеличьте максимальное значение. Неправильный.
    Чтобы получить двузначное число, необходимо преобразовать порядковый номер цикла, разделив его на 10.
    Чтобы лучше объяснить, ниже приводится определение, данное профессором колледжа Сенека Крисом Тайлером:

    Чтобы напечатать значение индекса цикла, вам нужно преобразовать целое число в символ цифры. В ASCII / ISO-8859-1 / Unicode UTF-8 цифровые символы находятся в диапазоне 48-57 (0x30-0x39). Вам также нужно будет собрать сообщение, которое будет напечатано для каждой строки - вы можете сделать это, записав цифру в буфер сообщения перед выводом на стандартный вывод, что, вероятно, является лучшим подходом, или вы можете выполнить последовательность записей для три части сообщения («Цикл:», число, «\ n»).Вы можете обратиться к `manpage` для ascii .

    x86_64 30 Решение цикла итераций

    aarch64 30 Решение цикла итераций

    Отражение

    Лично мне работа с ассемблером показалась мне сложной, но в то же время очень полезной. Синтаксис может быть очень запутанным и утомительным для работы. Мне нравится узнавать обо всех возможностях процесса. Все, что происходит между A-> B. Знакомство с низкоуровневым программированием на ассемблере дало мне некоторое представление о том, насколько сложной и запутанной может быть работа с оборудованием.Я также по-новому оценил компиляторы и IDE.

    Нравится:

    Нравится Загрузка ...

    Прагма цикла

    | Документы Microsoft

    • 2 минуты на чтение
    Эта страница полезна?

    Оцените свой опыт

    да Нет

    Любой дополнительный отзыв?

    Отзыв будет отправлен в Microsoft: при нажатии кнопки отправки ваш отзыв будет использован для улучшения продуктов и услуг Microsoft.Политика конфиденциальности.

    Представлять на рассмотрение

    В этой статье

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

    Синтаксис

    #pragma loop (hint_parallel ( n ))
    #pragma loop (no_vector)
    #pragma loop (ivdep92)

    Параметры

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

    Компилятор игнорирует этот параметр, если не указан переключатель компилятора / Qpar .

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

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

    Замечания

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

    См. Также

    Автоматическое распараллеливание и автоматическая векторизация
    Директивы Pragma и ключевые слова __pragma и _Pragma

    Программирование на ассемблере микроконтроллеров ARM Cortex-M - Часть 3

    Программирование на ассемблере микроконтроллеров ARM Cortex-M - Часть 3 - Циклы, массивы и функции Bo Joel Svensson
    blog (dot) joel (dot) svensson (at) gmail (dot) com

    Этот пример кодирования циклически перебирает некоторые шаблоны, хранящиеся в массиве, и отображает их на 4 светодиодах.Программа будет перебирать массив шаблонов и для каждой итерации изменять то, что выводится на PA0 - PA3. Чтобы замедлить переключение между шаблонами, реализована базовая функция задержки, которая вызывается на каждой итерации цикла.

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

    Видео с результатом показанного здесь кода можно найти на YouTube.

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

      задержка:
            ldr r0, = 1000000 @ Длительность задержки в итерациях
    delay_loop:
            cmp r0, # 0 @ Мы уже закончили?
            beq delay_done @ Если да, выпрыгни
            sub r0, r0, # 1 @ В противном случае, счетчик убытков
            b delay_loop @ и выполните еще одну итерацию
    delay_done:
            bx lr @ Возврат из вызова функции
      

    «Большое» число загружается в r0 , указывающее количество итераций, которые необходимо выполнить.Затем мы входим в тело цикла, которое проверяет, равно ли r0 0. Если r0 равно 0, мы должны выйти из цикла и вернуться. Если r0 больше 0, вычтите 1 из r0 и запустите тело цикла еще раз.

    Когда управление переходит к delay_done , когда r0 достигает 0, bx lr возвращается из вызова функции.

    Значение для использования в качестве задержки было выбрано методом проб и ошибок. Я действительно не знаю, насколько быстро MCU работает прямо сейчас (на какой частоте он работает).Я понимаю, что есть некоторые действительно хитрые вещи, связанные с "настройкой часов". Я пока ничего не знаю о том, как это работает! Мы обязательно должны посмотреть на это в будущем.

    Вот как реализовать функцию. Простая функция. Для вызова этой функции необходимо:

      бл задержка
      

    bl - это операция ветвления и ссылки. Эта инструкция переходит к функции задержки, но также сохраняет адрес возврата в регистре lr .Итак, инструкция bx lr в конце функции восстанавливает адрес из lr в счетчик программ. Этот подход к вызовам функций не использует никакого стека, поэтому как выполнять функции, вызывающие функции вложенным образом, - это то, на что нужно обратить внимание в будущем.

    Теперь давайте посмотрим на массив паттернов.

     . Раздел. Данные
    
    led_states: .byte 0x1, 0x2, 0x4, 0x8, 0xF, 0x0
            @ led_states мог быть сохранен во флэш-памяти, поскольку он постоянен.led_states_end:
      

    В этом случае массив помещается в секцию .data . Это раздел, для которого мы написали код запуска, чтобы скопировать его из флэш-памяти в оперативную память. Программа не будет пытаться изменить этот массив, поэтому он мог бы быть постоянным массивом, оставшимся только во флеш-памяти. Чтобы получить этот эффект, просто определите вместо этого массив в разделе .text .

    Символ led_states: относится к адресу, с которого начинается массив, а led_states_end относится к первому байту после любого из определенных байтов, которые являются частью массива.

    Сами данные перечислены сразу после директивы .byte .

    Теперь мы можем перейти к метке main: и рассмотреть эту часть кода по частям.

      основной:
            ldr r1, = 0x40023830 @ Адрес загрузки AHB1ENR
            ldr r0, [r1] @ Загрузить содержимое AHB1ENR
            orr r0, 0x1 @ Включите GPIO A
            str r0, [r1] @ Сохранить измененный AHB1ENR
    
            ldr r1, = 0x40020000 @ Указатель на PA MODER
            ldr r0, [r1] @ Значение PA MODER
            ldr r2, = 0xFFFFFF00
            и r0, r0, r2
            orr r0, r0, 0x55 @ PA0 - выход PA 3,
            str r0, [r1] @ Обратная запись PA MODER
      

    Код начинается так же, как и в предыдущих текстах.GPIO A (PA) включается, а затем 4 контакта PA устанавливаются в качестве выходных контактов.

    Затем мы должны войти в бесконечный цикл, который обновляет контакты PA0 - PA3. Тем не менее, несколько подготовительных инструкций перед зацикливанием:

      ldr r2, = led_states @ Загрузить адрес массива led_states
            ldr r6, = led_states_end @ Загрузить конечный адрес массива led_states
            ldr r3, = 0x40020014 @ Регистр выходных данных PA
            ldr r5, = 0xFFFFFF00 @ Очистить маску для интересующих бит
      

    Здесь регистры r2 , r6 , r3 и r5 устанавливаются на свои начальные значения для цикла.Фактически, только r2 будет изменяться в ходе цикла, а другой останется постоянным. r2 изначально будет указывать на начало массива паттернов. r6 всегда будет указывать на «конец» массива паттернов. Наконец, r3 и r5 будут содержать адрес регистра выходных данных PA и маску, которую мы используем для очистки выходов, которые мы переключаем.

      навсегда:
            ldrb r1, [r2], # 1 @ Загрузить байт из массива и увеличить адрес
            ldr r4, [r3] @ Состояние загрузки регистра выходных данных PA
            и r4, r4, r5 @ Очистить некоторые биты
            orr r4, r4, r1 @ Включите некоторые биты на основе значения led_states
            str r4, [r3] @ Запись в регистр выходных данных PA
      

    Цикл начинается с загрузки байта из массива led_states из адреса, хранящегося в r2 .Адрес в r2 увеличивается в той же инструкции, ldrb r1, [r2], # 1 . Остальная часть этого фрагмента кода знакома, это код, который устанавливает на некоторых выводах PA0-PA3 высокий уровень и, таким образом, включает светодиоды.

    Затем нам нужно проверить, прошли ли мы цикл по всем шаблонам и нужно ли перезапускать их с самого начала.

      cmp r2, r6 @ Мы достигли конца массива?
            blt forever_cont
            ldr r2, = led_states @ Сбросить r2 на начало led_states
    forever_cont:
            
            bl задержка
            б навсегда
      

    Если r2 , который отслеживает, где мы находимся в массиве, становится равным (или больше) значению в r6 ( let_states_end ), то мы должны сбросить r2 обратно, чтобы указать на начало led_states массив.Логика здесь немного обратная, поскольку она скорее проверяет, меньше ли r2 , чем r6 , и если оно меньше, она пропускает инструкции, которые выполняют сброс r2 .

    В любом случае код заканчивается на bl delay , который вызывает процедуру задержки. Затем цикл forever запускается еще раз.

    Полный листинг сборки

      .syntax унифицированный
            .cpu cortex-m4
            .большой палец
            
            .глобальная vtable
            .global reset_handler
    
            .section .text
            
    vtable:
            .word _estack
            .word reset_handler
            .word 0
            .word hard_fault_handler
    
    
            .thumb_func
    задерживать:
            ldr r0, = 1000000 @ Длительность задержки в итерациях
    delay_loop:
            cmp r0, # 0 @ Мы уже закончили?
            beq delay_done @ Если да, выпрыгни
            sub r0, r0, # 1 @ В противном случае, счетчик убытков
            b delay_loop @ и выполните еще одну итерацию
    delay_done:
            bx lr @ Возврат из вызова функции
            
            .thumb_func
    hard_fault_handler:
            b hard_fault_handler
    
            .thumb_func
    reset_handler:
            ldr r0, = _stack
            mov sp, r0
                    
            ldr r0, = _dstart
            ldr r1, = _dend
    
            sub r2, r1, r0
            cmp r2, # 0
            beq main
    
            ldr r1, = _flash_dstart
            
    cpy_loop:
            ldrb r3, [r1]
            strb r3, [r0]
    
            добавить r1, r1, # 1
            добавить r0, r0, # 1
            
            sub r2, r2, # 1
            cmp r2, # 0
            bne cpy_loop
            
    
    главный:
            ldr r1, = 0x40023830 @ Адрес загрузки AHB1ENR
            ldr r0, [r1] @ Загрузить содержимое AHB1ENR
            orr r0, 0x1 @ Включите GPIO A
            str r0, [r1] @ Сохранить измененный AHB1ENR
    
            ldr r1, = 0x40020000 @ Указатель на PA MODER
            ldr r0, [r1] @ Значение PA MODER
            ldr r2, = 0xFFFFFF00
            и r0, r0, r2
            orr r0, r0, 0x55 @ PA0 - выход PA 3,
            str r0, [r1] @ Обратная запись PA MODER
                    
    
            
            ldr r2, = led_states @ Загрузить адрес массива led_states
            ldr r6, = led_states_end @ Загрузить конечный адрес массива led_states
            ldr r3, = 0x40020014 @ Регистр выходных данных PA
            ldr r5, = 0xFFFFFF00 @ Очистить маску для интересующих бит
    навсегда:
            ldrb r1, [r2], # 1 @ Загрузить байт из массива и увеличить адрес
            ldr r4, [r3] @ Состояние загрузки регистра выходных данных PA
            и r4, r4, r5 @ Очистить некоторые биты
            orr r4, r4, r1 @ Включите некоторые биты на основе значения led_states
            str r4, [r3] @ Запись в регистр выходных данных PA
    
            cmp r2, r6 @ Мы достигли конца массива?
            blt forever_cont
            ldr r2, = led_states @ Сбросить r2 на начало led_states
    forever_cont:
            
            bl задержка
            б навсегда
    
            .раздел .data
    
    led_states: .byte 0x1, 0x2, 0x4, 0x8, 0xF, 0x0
            @ led_states мог быть сохранен во флэш-памяти, поскольку он постоянен.
    led_states_end:
      

    Заключение

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

    Еще несколько интересных вещей, которые можно добавить в список дел:

    1. Вызовы вложенных функций.
    2. Конфигурация часов.
    3. Другие способы написания более «принципиального» или «структурированного» ассемблера.

    Я хотел бы получить обратную связь, если вы заметите ошибки или что-то, что вы бы сделали иначе. Мы очень ценим любые подсказки и подсказки. Так что не стесняйтесь тыкать.

    Дополнительные ресурсы

    1. STM32F405 / 415 (407/417) (427/437) (429/439) справочное руководство
    2. Справочное руководство STM32F412xG / E
    3. STM32F405xx STM32F407xx лист данных
    4. STM32F411xC STM32F411xE
    5. Руководство по программированию микроконтроллеров и микропроцессоров STM32 Cortex®-M4
    6. вивономикон

    ДОМ

    Свяжитесь со мной с вопросами, предложениями или отзывами в блоге (точка) joel (точка) svensson (at) gmail (точка) com или присоединитесь к группе Google.

    © Copyright 2021 Бо Джоэл Свенссон

    Эта страница была создана с помощью Pandoc.

    новичок - Сборка AT&T - Базовый цикл и запись

    Начнем с простого:

    . - привет - Вы должны понимать, что привет относится к адресу. И это . относится к «текущему» адресу. Итак, . - hello - это расстояние между текущим местоположением и hello ; фактически длина привет.

    Просто один из тех приемов, которым вы научитесь. Хотя вы можете вручную указать длину в len , всегда есть шанс, что когда-нибудь кто-то изменит содержимое hello и забудет изменить len . Сделанный таким образом, он самоподдерживается. Возможность вычислять это «во время сборки», а не подсчитывать байты во время выполнения, также является бонусом.

    Что касается самого кода, позвольте мне начать с главного: комментариев.

    Assembly может быть сложной задачей для правильного кодирования, а иногда еще сложнее поддерживать.Особенно когда не понимаешь, что такое # @%! парень, который это писал, пытался это сделать.

    Я понимаю, что это проект только для новичка. Но вы должны научиться комментировать раньше:

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

    Например:

     выход $ 0; Выйти из приложения с кодом возврата 0 

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

    Далее (в произвольном порядке) я бы посмотрел на этот раздел кода:

      mov $ 1,% esi
    l:
      напишите $ hello, $ len
      inc% esi
      cmp $ 10,% esi
      jle l
      

    Как я уверен, вы знаете, цель инструкции cmp - установить флаги, чтобы вы могли использовать условные инструкции, такие как jle .Однако есть и другие инструкции, регулирующие те же флаги. Например, дек :

      mov $ 10,% esi
    l:
      напишите $ hello, $ len
      dec% esi
      jnz l
      

    Ничего волшебного, но спасает инструкцию.

    Далее у нас

    Не лучше ли использовать регистры% rax и системный вызов вместо int $ 0x80?

    Совершенно лучше использовать системный вызов . IF вы программировали для 64-битной версии. int 0x80 правильно для 32 бит. И когда я говорю 32 / 64bit, я имею в виду, является ли приложение 32-битным или 64-битным, а не ОС, на которой вы работаете.

    Примечание. Номер функции (и расположение каждого аргумента) различаются между int 0x80 и syscall .

    .
Оставить комментарий

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *