Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.06.2012, 12:43   #1
uniqm
 
Регистрация: 04.06.2012
Сообщений: 4
По умолчанию Записать в регистр DPTR

очень нужна помощь в написании программы под МК-51
само задание вот:Записать в регистр DPTR сумму двоичных чисел массива 20Н-3FH. Наименьшее число продублировать в регистре В.Заранее благодарен
uniqm вне форума Ответить с цитированием
Старый 06.06.2012, 13:19   #2
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Среда Keil uVision 3 --> http://rutracker.org/forum/viewtopic.php?t=916646

Функция init_array - инициализирует массив arr.

Функция sum_array - считает сумму и сохраняет её в регистре DPTR.

Поиск наименьшего элемента массива попробуйте реализовать сами.

Код:
NAME        PROCS                   ; beginning of program
MAIN        SEGMENT CODE            ; declare a segment of code
myvar       SEGMENT IDATA

arr         IDATA    20h
arr_end     IDATA    40h
BSIZE       EQU      arr_end-arr

CSEG     AT    0                 ; absolute address of code segment
USING    0                       ; use general-purpose registers (GPR): R0-R7

jmp     start
RSEG    MAIN                    ; beginning a segment of code

start:

    ; initialization of array
    call init_array

    ; summing up of array (result in DPTR)
    call sum_array

    sjmp $                      ; infinite loop


init_array:
    ; set counter in zero
    mov R0, #cnt
    mov @R0, #0

    ; get address of array
    mov R1, #arr

nxt_init_arr:
    mov A, @R0
    mov @R1, A
    inc @R0
    inc R1
    cjne @R0, #BSIZE, nxt_init_arr
    ret

sum_array:
    ; set counter in zero
    mov R0, #cnt
    mov @R0, #0

    ; get address of array
    mov R1, #arr

    ; set accumulator register in zero
    mov A, #0

    ; set DPH in zero
    mov DPH, #0

nxt_sum_array:
    clr c
    addc A, @R1
    jnc dont_carry
    inc DPH
    clr c
dont_carry:
    inc @R0
    inc R1
    cjne @R0, #BSIZE, nxt_sum_array
    mov DPL, A
    ret

RSEG      myvar 
cnt:      ds     1

END                             ; end of program
P.S. Это случайно не ваши одногруппники?
http://www.programmersforum.ru/showthread.php?t=203590
http://www.programmersforum.ru/showthread.php?t=203863

Последний раз редактировалось 8Observer8; 06.06.2012 в 13:25.
8Observer8 вне форума Ответить с цитированием
Старый 06.06.2012, 19:59   #3
uniqm
 
Регистрация: 04.06.2012
Сообщений: 4
По умолчанию

Цитата:
Сообщение от 8Observer8 Посмотреть сообщение
Среда Keil uVision 3 --> http://rutracker.org/forum/viewtopic.php?t=916646

Функция init_array - инициализирует массив arr.

Функция sum_array - считает сумму и сохраняет её в регистре DPTR.

Поиск наименьшего элемента массива попробуйте реализовать сами.

Код:
NAME        PROCS                   ; beginning of program
MAIN        SEGMENT CODE            ; declare a segment of code
myvar       SEGMENT IDATA

arr         IDATA    20h
arr_end     IDATA    40h
BSIZE       EQU      arr_end-arr

CSEG     AT    0                 ; absolute address of code segment
USING    0                       ; use general-purpose registers (GPR): R0-R7

jmp     start
RSEG    MAIN                    ; beginning a segment of code

start:

    ; initialization of array
    call init_array

    ; summing up of array (result in DPTR)
    call sum_array

    sjmp $                      ; infinite loop


init_array:
    ; set counter in zero
    mov R0, #cnt
    mov @R0, #0

    ; get address of array
    mov R1, #arr

nxt_init_arr:
    mov A, @R0
    mov @R1, A
    inc @R0
    inc R1
    cjne @R0, #BSIZE, nxt_init_arr
    ret

sum_array:
    ; set counter in zero
    mov R0, #cnt
    mov @R0, #0

    ; get address of array
    mov R1, #arr

    ; set accumulator register in zero
    mov A, #0

    ; set DPH in zero
    mov DPH, #0

nxt_sum_array:
    clr c
    addc A, @R1
    jnc dont_carry
    inc DPH
    clr c
dont_carry:
    inc @R0
    inc R1
    cjne @R0, #BSIZE, nxt_sum_array
    mov DPL, A
    ret

RSEG      myvar 
cnt:      ds     1

END                             ; end of program
P.S. Это случайно не ваши одногруппники?
http://www.programmersforum.ru/showthread.php?t=203590
http://www.programmersforum.ru/showthread.php?t=203863
видимо это с потока)правда мы пишем самыми простыми командами и ваше решение не подойдет.Но спасибо за помощь
uniqm вне форума Ответить с цитированием
Старый 06.06.2012, 20:09   #4
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Цитата:
правда мы пишем самыми простыми командами и ваше решение не подойдет.
Кстати, на си совсем просто получится.
8Observer8 вне форума Ответить с цитированием
Старый 07.06.2012, 04:34   #5
uniqm
 
Регистрация: 04.06.2012
Сообщений: 4
По умолчанию

да понятно что на си там строк 15)но увы,надо на ассемблере
uniqm вне форума Ответить с цитированием
Старый 07.06.2012, 11:54   #6
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Я не понимаю. Ваша цель какая?

1) Научиться программировать микроконтроллеры
2) Получить зачёт

Если второе, то это печально. Значит, вы:

- либо выбрали не то направление, не ту специальность, не тот факультет (может на гуманитарный
факультет надо было идти)

- либо у вас нет мотивации (или вы её не осознаёте)

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

Если вы не хотите, чтобы у вас в будущем были проблемы, то вы обязаны:
1) поставить среду (к примеру, Keil);
2) скопировать туда мою программу;
3) пройти программу по шагам. Попутно отмечая, что делает тот или иной оператор (система
команд здесь --> http://www.8052.com/set8051);
4) описать в этой теме все непонятные места. Можно вот так:

Что делает эта команда и почему здесь решётка?:
Код:
mov R1, #0
Что делает эта последовательность команд?:
Код:
    mov R0, #cnt
    mov @R0, #0
Что делает эта функция?:
Код:
init_array:
    ; set counter in zero
    mov R0, #cnt
    mov @R0, #0

    ; get address of array
    mov R1, #arr

nxt_init_arr:
    mov A, @R0
    mov @R1, A
    inc @R0
    inc R1
    cjne @R0, #BSIZE, nxt_init_arr
    ret
Что для чего эта строка?:
Код:
MAIN        SEGMENT CODE
Что это такое?:
Код:
arr         IDATA    20h
arr_end     IDATA    40h
BSIZE       EQU      arr_end-arr
В процессе такого разговора возможно следующее:
- будут найдены ошибки (которые при компиляции не обнаруживаются);
- будет найдено более правильное решение;
- в процессе обсуждения более старшие и опытные форумчане помогут
ликвидировать пробелы в наших знаниях;

Если вы всё-таки настроены серьёзно, то нужно:
5) найти в интернете схемы программаторов;
6) программы для прошивки;
7) собрать программатор;

Самое интересное:
8) искать идеи (проекты) и реализовывать их (к примеру, заняться робототехникой на уровне
хобби; это в учёбе вам поможет и в работе);
9) самому придумывать проекты и реализовывать их.

Удачи!

P.S. И что значит написать проще? Программа написана - если она может выполняться в целевой
среде (ну хотя бы в эмуляторе).
8Observer8 вне форума Ответить с цитированием
Старый 08.06.2012, 15:03   #7
uniqm
 
Регистрация: 04.06.2012
Сообщений: 4
По умолчанию

MOV R0,#20H ;загрузка адреса массива
MOV R7,#32 ;загрузка размера массива
MOV 70,#FFH ;загрузка максимального числа для сравнения
MOV 71,#0 ;ячейка для сохранения аккумулятор
M1: MOV A,@R0 ;загрузка значения элемента массива
CJNE A,70,M5 ;переход на М5 если не равны
JMP M7 ;переход на М7
M5: JC M6 ;переход на М6 если перенос равен 1
JMP M7 ;переход на М7
M6: MOV 70,A ;сохранения аккумулятора в 70 ячейку
M7: MOV A,71 ;запись в аккумулятор 71 ячейки
ADD A,@R0 ;сложение элемента массива с аккумулятором
MOV 71,A ;сохранение аккумулятора в 71 ячейку
INC R0 ;инкремент R0
MOV DPL,A ;запись в DPL результата сложения
LCALL M3 ;вызов подпрограммы М3
DJNZ R7,M1 ;зацикливание и переход на М1
SJMP M4 ;переход на М4
M2: INC DPH ;увеличение на один DPH
CLR C ;сброс переноса
M3: JC M2 ;переход на М2 если перенос равен 1
RET ;возврат из подпрограммы
M4: MOV B,70 ;запись в регистр В наименьшего числа
END
вот так решил задание.Приняли)значит правильно
uniqm вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Регистр EBP ABCDEF1551 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 24 17.02.2012 01:43
как сравнить 4 числа,и наименьшее записать в оставшийся регистр ? dezder Помощь студентам 0 16.12.2011 09:47
Регистр в таблицах БД Alexij БД в Delphi 3 17.04.2008 13:38
Регистр символов Никки Общие вопросы Delphi 1 22.12.2007 20:14
регистр vitalik007 Общие вопросы Delphi 2 15.09.2007 02:41