Тема: MASM. Незрозуміле завдання
Привіт усім!
є у мене таке проблемне завдання по старому асемблеру під дос і я не розумію трохи умову.
Як саме його розпаковувати? адже DD 32 біти, а DW 16 біт, куди і як кидати по 4 біти?
Ви не увійшли. Будь ласка, увійдіть або зареєструйтесь.
Ласкаво просимо вас на україномовний форум з програмування, веб-дизайну, SEO та всього пов'язаного з інтернетом та комп'ютерами.
Будемо вдячні, якщо ви поділитись посиланням на Replace.org.ua на інших ресурсах.
Для того щоб створювати теми та надсилати повідомлення вам потрібно Зареєструватись.
Український форум програмістів → Системне програмування → MASM. Незрозуміле завдання
Сторінки 1
Для відправлення відповіді ви повинні увійти або зареєструватися
Привіт усім!
є у мене таке проблемне завдання по старому асемблеру під дос і я не розумію трохи умову.
Як саме його розпаковувати? адже DD 32 біти, а DW 16 біт, куди і як кидати по 4 біти?
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
такс, якось мучено написав
.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". Що я зробив не так?
rcr - це циклічний зсув:
mov ax, A001h
rcr ax, 1
; ax == C000h, остання одиничка перенеслася!
Вам потрібен shr - логічний зсув.
shr дав такий же результат
ще тільки що побачив, друге число не правильно розпаковується, хоча дії виконую ті ж самі що й над першим...
ось результат роботи для цих чисел
0011 1011 1001 1010 1100 1010 0000 0000b, 1011 1011 1001 1010 0000 1010 0000 1100b
перше число нормально розбило, якби не те зайве на початку кожного числа, звісно це можна виправити ще одним циклом, просто старший байт занулити, але це не дуже)
воно обчислює саме число правильно, але в масиві зберігається із зайвим, я пробував виводити ті числа не збереженими, а прямо із регістру, тоді все норм...але мені їх треба зберегти
а от з другим числом взагалі містика, ладно ще зрозумів би якби їх місцями покрутило, а то ж взагалі невідомо звідки деякі числа взялись там)
може я не так якось зберігаю в масив?
Все, зробив. Я справді не правильно зберігав у масив, наплутав трохи з індексами
Може кому цікаво буде, то ось код, тепер все працює правильно і виводить в правильному порядку.
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
Сторінки 1
Для відправлення відповіді ви повинні увійти або зареєструватися