Другие языки программирования и технологии

Создать программу(описание ниже)

Создать программу с функциями упаковки/распаковки группы из 3 чисел диапазона 0..31 (00000..11111) в переменной типа word (свободные разряды справа).
Гриб Молочный, совсем не то. Нужно не строку копировать, а три пятиразрядных числа уместить в два байта.
Язык неизвестен, Visual Studio, MASM, i80386, подпрограммы выделены жирным шрифтом:

.386
.model flat, stdcall
option casemap:none

printf proto C :vararg
_putch proto C :dword
_getch proto C
ExitProcess proto :dword

.data
dGroup db 24, 15, 29
Text1 db "Заданная группа чисел: ", 13, 10, 0
Text2 db 13, 10, 10, "Упакованные числа: ", 13, 10, 0
Text3 db 13, 10, 10, "Распакованные числа: ", 13, 10, 0
Form db "%u", 0

.data?
rPack dw ?
rGroup db 3 dup (?)

.code
;Функция упаковки
Pack proc uses edx ecx esi, lpGroup :dword
    mov esi, lpGroup
    add esi, 2
    mov ecx, 3
    xor ax, ax
@@:
    mov dl, [esi]
    shl dx, 11
    shr ax, 5
    or ax, dx
    dec esi
    loop @B
    ret
Pack endp

;Функция распаковки
UnPack proc uses eax edx ecx edi, Data: word, lpGroup :dword
    mov edi, lpGroup
    mov ecx, 3
    mov dx, Data
@@:
    rol dx, 5
    mov al, dl
    and al, 1Fh
    stosb
    loop @B
    ret
UnPack endp

WriteDec proc uses eax ecx, Number: byte
    movzx eax, Number
    invoke printf, addr Form, eax
    ret
WriteDec endp

WriteBin proc uses eax ecx edx edi, Number :word
    local Buff[17] :byte
    mov dx, Number
    mov ecx, 16
    lea edi, Buff
@@:
    rcl dx, 1
    setc al
    or al, 30h
    stosb
    loop @B
    xor al, al
    stosb
    invoke printf, addr Buff
    ret
WriteBin endp

WriteGroup proc uses eax ecx edx esi, lpGroup :dword
    mov esi, lpGroup
    mov ecx, 3
    jmp WG1
@@:
    push ecx
    invoke _putch, ','
    pop ecx
WG1:
    invoke WriteDec, byte ptr [esi]
    inc esi
    loop @B
    ret
WriteGroup endp

N94900008:
    invoke printf, addr Text1
    invoke WriteGroup, addr dGroup
    invoke Pack, addr dGroup
    mov rPack, ax
    invoke printf, addr Text2
    invoke WriteBin, rPack
    invoke UnPack, rPack, addr rGroup
    invoke printf, addr Text3
    invoke WriteGroup, addr rGroup
    invoke _getch
    invoke ExitProcess, 0

    end N94900008

АС
Алексей Серпуховитин
51 590
Лучший ответ
.model flat
option casemap:none
data1 segment
src DB "Test STRING To Copy"
len EQU $-src
data1 ends
data2 segment public
dst DB len+1 DUP('+')
data2 ends
code segment
_seg_ex proc
assume CS:FLAT,DS:FLAT, SS:FLAT, ES:FLAT, FS:ERROR, GS:ERROR
mov ESI, offset data1
mov EDI, offset data2
cld
mov CX, len
rep movsb
mov EAX, offset data2
ret
_seg_ex endp
code ends
end
на каком языке ?