Помогите с программками

Низкоуровневое программирование портов, микроконтроллеров и т.д.

Модератор: Andy

Ответить
Mendler
Сообщения: 6
Зарегистрирован: 10 апр 2007, 19:55

Помогите пожалуйста начинающему. Немогу разобраться с языком :)
Программирую под Pdp-11.
Использую компилятор Tasm.

1. Имеется массив из 10 двухбайтовых элементов, адрес массива находится в регистре R4, нужно посчитать сумму всех нечетных элементов и записать результат в регистр R5.

2. Имеется массив из 10 однобайтовых элементов, адрес массива находится в регистре R1, нужно поделить все элементы на 2, не используя команду Div.
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

Мне, например, неизвестен Pdp-11, для каких он микросхем? Без доков ничем помочь не могу.
It's a long way to the top if you wanna rock'n'roll
Mendler
Сообщения: 6
Зарегистрирован: 10 апр 2007, 19:55

Мне нужен пример кодов на Tasm, программирование под pdp-11, я думаю ничем не отличается ...
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

&quot писал(а):я думаю ничем не отличается ...
Согласен, ассемблер и в Африке - ассемблер, только набор команд под разные микросхемы свой. Для 80х86 будет выглядеть так:

Код: Выделить всё

.code

push cs
pop ds   ; Data segment preparing

xor dx, dx                 ; DX - 16-bit summ of array's elements. First it's zero.
mov si, offset Array   ; Address of Array to SI
mov cx, 10
    @lab1:
mov ax, [si]        ; AX = Element
and ax, 1            ; if 0-bit of BX is set, it means the number is odd
cmp ax, 1
jnz @lab2           ; if not odd, skip next commands
add dx, [si]        ; Calculating summ
    @lab2:
add si, 2
dec cx
jnz @lab1          ; Next element

mov ax, 4C00h   ; Termination
int 21h

Array dw 100, 93, 657, 194, 382, 101, 395, 192, 483, 921

end

Код: Выделить всё

.code

push cs
pop ds   ; Data segment preparing

mov si, offset Array   ; Address of Array to SI
mov cx, 10
    @lab1:
mov ax, [si]        ; AX = Element
shr ax, 1             ; Shifting bits right by 1, it's equalient divizion by 2
mov [si], ax        ; Store result back
add si, 2
dec cx
jnz @lab1          ; Next element

mov ax, 4C00h   ; Termination
int 21h

Array dw 100, 93, 657, 194, 382, 101, 395, 192, 483, 921

end
Замечания к первой: Сумма 10-и 16-разрядных элементов может превышать 16 разрядов и не уместиться в DX
Замечания ко второй: Сдвиг битов вправо - аналог деления на 2, однако самый крайний 0-бит теряется, потому при делении нечетных чисел результат становиться неточным (5 / 2 = 2)
Все коды написаны с учетом максимальной совместимости с другими микросхемами.
It's a long way to the top if you wanna rock'n'roll
Ответить