1

Тема: MASM. Незрозуміле завдання

Привіт усім!
є у мене таке проблемне завдання по старому асемблеру під дос і я не розумію трохи умову.
http://cs624429.vk.me/v624429913/46b84/3ci2qka5xfk.jpg
Як саме його розпаковувати? адже DD 32 біти, а DW 16 біт, куди і як кидати по 4 біти?

2

Re: MASM. Незрозуміле завдання

DD - 32 біти, по 4 біти - це буде 8 фрагментів, кожен з яких треба записати в окремий DW. Наприклад,

1000000000(dec) = 00111011100110101100101000000000b

розбиваємо:

0011 1011 1001 1010 1100 1010 0000 0000

розпаковуємо:

00000000 00000011
00000000 00001011 
00000000 00001001
00000000 00001010 
00000000 00001100 
00000000 00001010 
00000000 00000000 
00000000 00000000
Подякували: wwtarasww, 0xDADA11C7, Kane3

3

Re: MASM. Незрозуміле завдання

дякую! :)
буду пробувати реалізувати.

4

Re: MASM. Незрозуміле завдання

такс, якось мучено написав

       .8086
stack  segment para stack 'stack'
       DW   256 dup(0)
stack  ends
;
dseg   segment para public 'data'
mas    dd 00111011100110101100101000000000b, 10111011100110100000101000001100b
masr   dw 16 dup (?)
cnt    dw 0
ii     dw ?
m3     DB 13,10,'$'

dseg   ends
;

 ;00111011 10011010 11001010 00000000

cseg   segment para public 'code'
main   proc far
       assume cs:cseg,ds:dseg,ss:stack,es:dseg
;
       push ds
       mov ax,0
       push ax
; initial seg data
       mov ax,dseg
       mov ds,ax

;===================================div to 16 bit
MOV     CX,2  
mov si, 0
LDIV:
mov ax, WORD ptr mas[si] 
push ax
mov ax, WORD ptr mas[si]+2 
push ax
inc si
LOOP    ldiv 
;===================================div to 4 bit
pop ax
mov cnt, ax
mov ax, 0
mov dx, cnt
and dx, 0f000h
mov cl, 12
rcr dx, cl
mov masr[0], dx

mov dx, cnt
and dx, 0f00h
mov cl, 8
rcr dx, cl
mov masr[1], dx
mov dx,0

mov dx, cnt
and dx, 00f0h
mov cl, 4
rcr dx, cl
mov masr[2], dx

mov dx, cnt
and dx, 000fh
mov masr[3], dx

pop ax
mov cnt, ax
mov dx, cnt
and dx, 0f000h
mov cl, 12
MOV     DL,00
rcr dx, cl
mov masr[4], dx

mov dx, cnt
and dx, 0f00h
mov cl, 8
MOV     DL,00
rcr dx, cl
mov masr[5], dx

mov dx, cnt
and dx, 00f0h
mov cl, 4
MOV     DL,00
rcr dx, cl
mov masr[6], dx

mov dx, cnt
and dx, 000fh
mov masr[7], dx

pop ax
mov cnt, ax
mov ax, 0
mov dx, cnt
and dx, 0f000h
mov cl, 12
rcr dx, cl
mov masr[8], dx

mov dx, cnt
and dx, 0f00h
mov cl, 8
rcr dx, cl
mov masr[9], dx
mov dx,0

mov dx, cnt
and dx, 00f0h
mov cl, 4
rcr dx, cl
mov masr[10], dx

mov dx, cnt
and dx, 000fh
mov masr[11], dx

pop ax
mov cnt, ax
mov dx, cnt
and dx, 0f000h
mov cl, 12
MOV     DL,00
rcr dx, cl
mov masr[12], dx

mov dx, cnt
and dx, 0f00h
mov cl, 8
MOV     DL,00
rcr dx, cl
mov masr[13], dx

mov dx, cnt
and dx, 00f0h
mov cl, 4
MOV     DL,00
rcr dx, cl
mov masr[14], dx

mov dx, cnt
and dx, 000fh
mov masr[15], dx

;=============================write
mov si, 0
mov cx, 16
cykl2:
    mov ii, cx
    mov cx, 16
    mov dx, masr[si]
    mov dh, 00
    MOV     Bx, dx
        MOV     AH,02
        Lwrt1: 
        MOV     DL,00
        RCL     Bx,1
        mov     dl, 30h
        ADC     DL,0
        INT     21h
        LOOP    lwrt1
    mov ah, 9
    lea dx, m3
    int 21h
    inc si
    mov cx, ii
loop cykl2
;============================end


mov ah, 00h
int 16h

;
       ret 
int 20h
main   endp
cseg   ends
       end main

але є кілька питань,там в умовному розділі мого коду "div to 4 bit"  не зміг зробити це циклом, якщо в циклі діставати із стеку то взагалі вилазять страшні баги. Також якщо прибрати 153 рядок "mov dh, 00" то перші половини кожного числа, містять другу половину з наступного, це я напевно щось накрутив в тому ж "розділі" "div to 4 bit". Що я зробив не так?

5

Re: MASM. Незрозуміле завдання

rcr - це циклічний зсув:

mov ax, A001h
rcr ax, 1
; ax == C000h, остання одиничка перенеслася!

Вам потрібен shr - логічний зсув.

Подякували: 0xDADA11C71

6 Востаннє редагувалося wwtarasww (25.08.2015 18:39:01)

Re: MASM. Незрозуміле завдання

shr дав такий же результат
ще тільки що побачив, друге число не правильно розпаковується, хоча дії виконую ті ж самі що й над першим...
ось результат роботи для цих чисел

0011 1011 1001 1010 1100 1010 0000 0000b, 1011 1011 1001 1010 0000 1010 0000 1100b

http://cs624429.vk.me/v624429913/46df0/ccbqwa0tv28.jpg
перше число нормально розбило, якби не те зайве на початку кожного числа, звісно це можна виправити ще одним циклом, просто старший байт занулити, але це не дуже)
воно обчислює саме число правильно, але в масиві зберігається із зайвим, я пробував виводити ті числа не збереженими, а прямо із регістру, тоді все норм...але мені їх треба зберегти
а от з другим числом взагалі містика, ладно ще зрозумів би якби їх місцями покрутило, а то ж взагалі невідомо звідки деякі числа взялись там)

може я не так якось зберігаю в масив?

7

Re: MASM. Незрозуміле завдання

Все, зробив. Я справді не правильно зберігав у масив, наплутав трохи з індексами
Може кому цікаво буде, то ось код, тепер все працює правильно і виводить в правильному порядку.

   
stack  segment para stack 'stack'
       DW   256 dup(0)
stack  ends
;
dseg   segment para public 'data'
mas    dd 00111011100110101100101000010001b, 01111011100110100000101000001100b
masr   dw 32 dup (?)
cnt    dw 0
ii     dw ?
m3     DB 13,10,'$'

dseg   ends
;

 ;0011 1011 1001 1010 1100 1010 0001 0001
 
 ;0111 1011 1001 1010 0000 1010 0000 1100

cseg   segment para public 'code'
main   proc far
       assume cs:cseg,ds:dseg,ss:stack,es:dseg
;
       push ds
       mov ax,0
       push ax
; initial seg data
       mov ax,dseg
       mov ds,ax

;===================================div to 16 bit
MOV     CX,2  
mov si, 0
mov di, 0

LDIV:

mov ax, WORD ptr mas[si]
mov  masr[di+8], ax
mov  masr[di+10], ax
mov  masr[di+12], ax
mov  masr[di+14], ax

mov ax, WORD ptr mas[si]+2
mov  masr[di], ax
mov  masr[di+2], ax
mov  masr[di+4], ax
mov  masr[di+6], ax

add si,4
add di, 16
LOOP    ldiv 
;===================================div to 4 bit
mov si, 0
mov cx, 4

cykl0:
mov ii, cx
mov ax, masr[si]
and ax, 0f000h
mov cl, 12
shr ax, cl
mov masr[si], ax
inc si
inc si

mov ax, masr[si]
and ax, 0f00h
mov cl, 8
shr ax, cl
mov masr[si], ax
mov dx,0
inc si
inc si

mov ax, masr[si]
and ax, 00f0h
mov cl, 4
shr ax, cl
mov masr[si], ax
inc si
inc si

mov ax, masr[si]
and ax, 000fh
mov masr[si], ax
inc si
inc si
mov cx, ii
loop cykl0

;=============================write
mov si, 0
mov cx, 16
cykl2:
    mov ii, cx
    mov cx, 16
    mov dx, masr[si]
    ;mov dh, 00
    MOV     Bx, dx
        MOV     AH,02
        Lwrt1: 
        MOV     DL,00
        RCL     Bx,1
        mov     dl, 30h
        ADC     DL,0
        INT     21h
        LOOP    lwrt1
    mov ah, 9
    lea dx, m3
    int 21h
    inc si
    inc si
    mov cx, ii
loop cykl2
;============================end

mov ah, 00h
int 16h

;
       ret 
int 20h
main   endp
cseg   ends
       end main
Подякували: koala, 0xDADA11C72