Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Assembler

Автор: ShIvADeSt
Дата сообщения: 29.11.2006 00:42
Обсуждаются все вопросы, связанные с программированием на Ассемблере как общего так и конкретного характера.

важное примечание
для тех кто считает, что здесь место халявных исполнений курсовых и лабораторных работ.
тут обычно помогают тем, кто сам хоть что-то пытается понять и сделать, но что-то не понимает, что-то не получается...
ведь ассемблер изучают и задачки на нём дают обычно не менеджерам по продажам и даже не всем физ.-мат. специальностям
вы сами избрали этот путь? вот и идите по нему сами, ножками... с ручками и с головой...

короче, тут не сборище придурков-альтруистов, которым нечего делать и они ждут-не дождутся когда вы их попросите
что-то сделать _за_ вас
если позарез надо и вы даже готовы заплатить, тогда вам сюда
удачи

некоторые ресурсы
http://www.wasm.ru/ Самый популярный русскоязычный ресурс.
Ассемблер - книги (ASM, Assembler)

Просьба к пишущим и отвечающим - все большие листинги оформлять тегом more.

если вам вдруг не отвечают или ответ вас не устраивает
и вообще полезно прочитать всем спрашивающим
Автор: HRyk
Дата сообщения: 08.12.2006 20:02
Друзья,помогите доработать программу!!!
Имеется программа на Assembler которая ищет целое слово, введенное с клавиатуры в файле "wesna.dat". как сделать так, чтобы поиск осуществлялся не в одном файле, а в нескольких-например, в четырех.
[more]
Код программы:
sega    segment
            assume    cs:sega,ds:sega
            org    100h
        beg:    mov    ah,3dh        ;открытие файла
            mov    al,2        ;атрибут 2-чт-з
            lea    dx,fname
            int    21h
            mov    handle,ax
                        
                
            
            mov    si,0
            mov    di,0
         m1:     mov    ah,42h        ;установка указ
            mov    al,0        ;код метода смещ 0-абс смещ
            mov    bx,handle     
                        
            mov    cx,0        
            mov    dx,t        ;младш часть смещ t
            int    21h        ;в начале t=0
            mov    ah,3fh        ;чтение ф
            mov    bx,handle
            mov    cx,6        ;сколько читать
            lea     dx,buf        ;куда читать
            int    21H
        

        a1: mov    di,si
            mov    ah,01h
            int    21h    
            mov    t1[si],al
            mov    bl,buf[di]
            cmp    al,bl
            jne    m4
            inc    si
            inc    di
            cmp    si,6
            cmp    di,6
            jne    a1
je    m2        
    
                    
                    
        m4:    add    t,6        ;не нашли -переходим к след
            inc    si
            cmp    si,6;'''5
            jne    m1        ;если все просмотрели и не
            
mov    ah,09h        ;нашли то выход
            lea    dx,tx1
            int    21h
        m3:    mov    ah,08h
            int    21h
            int    20h

        m2:    mov    ah,09h        ;нашли и вывели на экран
            lea    dx,tx2            
            int    21h
            mov    ah,40h
            lea    dx,buf
            mov    cx,6
            mov    bx,1
            int    21h
            jmp    m3
        tx1    db    ' не найдена ','$'
        tx2    db    ' найдена ','$'
                
        t    dw    0                
        fname    db    'wesna.dat',0
        handle    dw    ?
        buf    db    ' '
        t1 db    ' '
            
            
        sega    ends
            end    beg
[/more]
Автор: rain87
Дата сообщения: 08.12.2006 21:54
HRyk
с кодом - рабочий или нет - не разбирался
[more]
но кучу файлов вставил. добавлять можно сколько угодно
Код: sega segment
assume cs:sega,ds:sega
org 100h
beg:
xor si,si
again:
push si

mov ah,3dh ;открытие файла
mov al,2 ;атрибут 2-чт-з
mov dx,fnames[si]
int 21h
mov handle,ax



mov si,0
mov di,0
m1: mov ah,42h ;установка указ
mov al,0 ;код метода смещ 0-абс смещ
mov bx,handle

mov cx,0
mov dx,t ;младш часть смещ t
int 21h ;в начале t=0
mov ah,3fh ;чтение ф
mov bx,handle
mov cx,6 ;сколько читать
lea dx,buf ;куда читать
int 21H


a1: mov di,si
mov ah,01h
int 21h
mov t1[si],al
mov bl,buf[di]
cmp al,bl
jne m4
inc si
inc di
cmp si,6
cmp di,6
jne a1
je m2



m4: add t,6 ;не нашли -переходим к след
inc si
cmp si,6;'''5
jne m1 ;если все просмотрели и не

mov ah,09h ;нашли то выход
lea dx,tx1
int 21h
m3: mov ah,08h
int 21h


pop si
cmp si,fcnt
je over
inc si
jmp again
over:

int 20h

m2: mov ah,09h ;нашли и вывели на экран
lea dx,tx2
int 21h
mov ah,40h
lea dx,buf
mov cx,6
mov bx,1
int 21h
jmp m3
tx1 db ' не найдена ','$'
tx2 db ' найдена ','$'

t dw 0
fname db 'wesna.dat',0



fname2 db 'f1.txt',0
fname3 db 'f2.txt',0
fname4 db 'f3.txt',0
fname5 db 'f5.txt',0
fnames dw fname,fname2,fname3,fname4,fname5
fcnt dw 5


handle dw ?
buf db ' '
t1 db ' '


sega ends
end beg
Автор: HRyk
Дата сообщения: 16.12.2006 14:28
Товарищи, нужна помощь в решении. Написал две программки, 1-я заполняет файл "константными записями", заданными в самой программе,
2-я осуществляет буферезированный ввод строки.
Как теперь осуществить буферезированное заполнение файла?

код 1-ой программы:
; заполнение
    ;    файла 'wesna.dat'

        sega    segment
            assume    cs:sega,ds:sega
            org    100h
        beg:    mov    ah,3dh        ;открытие файла
            mov    al,1        ;атрибут 0-чт 1-з 2-чт-з
            lea    dx,fname
            int    21h
            mov    handle,ax
            mov    si,0
            mov    di,0
         m1:     mov    ah,42h        ;установка указ
            mov    al,0        ;код метода смещ 0-абс смещ
            mov    bx,handle     ;1-от нач ф с текущ позиции
                        ;2- от конца ф с текущ поз
            mov    cx,0        ;старш часть смещ
            mov    dx,t        ;младш часть смещ
            int    21h
            mov    ah,40h        ;чтение ф
            mov    bx,handle
            mov    cx,5        ;сколько читать
            lea     dx,buf[di]        ;куда читать
            int    21H
            add    di,5
            add    t,5
            inc    si
            cmp    si,5
            jne    m1
            
            
            int    20h
        t    dw    0                
        fname    db    'wesna.dat',0
        handle    dw    ?
        buf    db    'a111k'
            db    'b222l'
            db    'c333k'
            db    'd444l'
         db 'e555k'


код 2-ой программы:
art    segment
                assume    cs:art,ds:art
                org    100h
            m1:    mov    ah,0ah
                lea    dx,buf
                int    21h
                mov    ah,09h    
                lea    dx,t3
                int    21h
                mov    bl,t1
                mov    di,0
            m2:    mov    al,t2[di]
                mov    t4[di],al
                inc    di
                cmp    di,bx
                jne    m2
                mov    t4[di],'$'
                mov    ah,09h
                lea    dx,t4
                int    21h
                mov    ah,08h
                int    21h
                int    20h
        ;    fname    db    'leto.dat',0
            handle    dw    ?
            buf    db    10
            t1    db    ?
            t2    db    9 dup (' '),'$'
            t3    db    10,13,'$'
            t4    db    9 dup (' '),'$'
                art    ends
                end    m1        
Автор: rain87
Дата сообщения: 16.12.2006 20:29
блин. и что понимать под
Цитата:
буферезированное заполнение файла
?

зы. оформь всё в more, ShIvADeSt'у скоро надоест исправлять
Автор: HRyk
Дата сообщения: 16.12.2006 20:43
Нет проблем. Специально для ShIvADeSt'а готов на любые трудности. Буферезированное заполнение файла означает заполнение его любыми словами, вводимыми с клавиатуры. (Сейчас я умею заполнять файл "пробитыми константами" вида: a111k,b222l,c333k, как в программке 1) (Во второй программке я осилил буферезированный ввод строки) теперь нужно "совместить" эти программы, тоесть заполнять файл словами произвольной длины, вводимыми с клавиатуры, до тех пор, пока в файле не окажется некоторое количество символов. Не могу осилить уже несколько дней. Rain87, на тебя вся надежда
Автор: rain87
Дата сообщения: 16.12.2006 21:28
ShIvADeSt конечно будет безумно рад, узнав что такое буферизированное заполнение файла но я имел в виду то что написано в первом посте -
Цитата:
все большие листинги оформлять тегом more.

по поводу задач щас посмотрю

Добавлено:
HRyk
в общем, ни одна из прог работать не хочет, глючат и вылетают. разбираться почему - как бы влом, вылетают даже после фикса очевидных багов (вроде неинициализации DS и т.п.). может у меня компилер несовместим с твоим? у меня tasm5.0

по поводу задачи - ну а в чём проблема то? если умеешь вводить строку буферизовано вводи её (столько символов, сколько надо), а потом пиши в файл всё что ввёл

зы. по-моему разумно пользовать функции расширенного чтения и записи -
DOS Fn 3fH: Читать файл через описатель
DOS Fn 40H: Писать в файл через описатель
Автор: HRyk
Дата сообщения: 17.12.2006 13:38
ОК, Rain87, подскажи такую штукенцию: я прогу написал, она файл заполняет словами, вводимыми с клавы, но эти слова (в файле) если они меньше 9 символов, забиваются "значками" случайными, как это исправить?
Автор: rain87
Дата сообщения: 17.12.2006 19:04
HRyk
когда ты читаешь 21 интом 10 функцией, то она тебе возвращает количество реально считанных символов. вот ты когда пишешь в файл, СХ ставь не 9, а вот это число, которое вернула 10 функция инт 21
Автор: Morpy
Дата сообщения: 18.12.2006 19:36
У меня две нерешённых задачи по ассемблеру. Интересует вариант решения нижеприведённых заданий за деньги.

1)Шестнадцатеричное число представлено в виде строки ASCII. Преобразовать данную строку во внутреннее представление. Предусмотреть возможность многобайтного результата.

2)Заданы массивы A[N], B[N] из элементов типа word(целое 16-ти разрядное со знаком). Составить программу, формирующую массив C[N] из разности элементов массивов А и В.
(с[i]=a[i]-b[i]). Размерность элементов массива с[n] должна обеспечивать корректное вычитание(если результат не умещается в 16-ти разрядах)


Надеюсь на Вашу помощь.
Автор: akaGM
Дата сообщения: 18.12.2006 19:48
для
Цитата:
Интересует вариант решения нижеприведённых заданий за деньги

сюда
Автор: Morpy
Дата сообщения: 18.12.2006 22:12
Перенёс. Извините, просмотрел не все разделы :о
Автор: AHuTA
Дата сообщения: 25.12.2006 21:33
Объясните пож. как запустить TASM.exe в windowsXP?
или дайте ссылку. Спасибо!
Автор: TaHIOIIIkA
Дата сообщения: 25.12.2006 21:58
Ребят помогите пожалуйста решить пару задач?
времени обс. не хватает!
1 Ввести с клавиатуры строку. Посчитать в ней количество запятых.
Вывести результаты на экран.

2 Разработать две подпрограммы, одна из которых сравнивает
две строки по лексикографическому порядку,
а другая обменивает значения двух строк. Разработать программу,
которая вводит с клавиатуры несколь-ко строк (конец ввода пустая строка)
и сортирует их в лексикографическом порядке.(способ передачи параметров
в процедуру выбирать произвольно. Зациклить программу по вводу строки,
а признаком окончания работы считать ввод пустой строки.)
Автор: rain87
Дата сообщения: 26.12.2006 17:06
TaHIOIIIkA
1. [more]
Код: sseg segment stack
db 64 dup(?)
sseg ends
dseg segment
maxlen db 21
actlen db ?
string db 21 dup(?),'$'
dseg ends
cseg segment
assume cs:cseg,ss:sseg,ds:dseg
main proc far
push ds
xor ax,ax
push ax
mov ax,dseg
mov ds,ax
;-------------
lea dx,maxlen
mov ah,10
int 21h
mov cl,actlen
xor ch,ch
xor si,si
xor al,al
cmp cx,0
je over2
l1:
cmp byte ptr string[si],','
jne over
inc al
over:
inc si
loop l1
over2:
mov word ptr string[19],0A0Dh
mov si,18
mov bl,10
_out:
cbw
idiv bl
add ah,'0'
mov string[si],ah
dec si
test al,al
jnz _out
dec si
mov word ptr string[si],0A0Dh
lea dx,string
add dx,si
mov ah,9
int 21h
xor ax,ax
int 16h
;-------------
ret
main endp
cseg ends
end main
Автор: Qwezar
Дата сообщения: 04.01.2007 16:07
Люди, помогите плиз, эта прога ищет все полиндромы до 5000 нужно их вывести на экран и в файл, с экраном все ОК, а вот с файлом проблема, создается пкстой txt и все.


Код:
MODEL TINY
.486
.CODE
assume cs:@code,ds:@code,es:@code,ss:@code
org 100h

begin:

mov ah,3ch ;Создание файла
mov cx,0 ;Для записи и чтения
mov dx,offset fn
mov bx,fnd
int 21h
mov fnd,ax

mov word ptr count,0
;до 10
mov eax,-1
p1:
inc eax
push eax
inc count
call print_n pascal,eax,word ptr 0,word ptr 1,word ptr 1,word ptr 0,word ptr 0
mov ah,2h
mov dl,32
int 21h

pop eax

cmp eax,9
jb p1

;двузначные
mov eax,-1
mov ebx,0
p2:

t1: inc eax
jmp t3

t2: inc ebx
jmp t3

t3:
cmp eax,ebx
jnz nm1

push eax
push ebx
inc count
call print_n pascal,eax,word ptr 0,word ptr 1,word ptr 1,word ptr 0,word ptr 0
call print_n pascal,ebx,word ptr 0,word ptr 1,word ptr 1,word ptr 0,word ptr 0
mov ah,2h
mov dl,32
int 21h

pop ebx
pop eax

nm1:
cmp ebx,9
jz nm2

jmp t2

nm2:
mov ebx,0
cmp eax,9
jz p3

jmp t1
;трехзначные

p3:
mov eax,0
mov ebx,0
mov ecx,0
jmp r4

r1: inc eax
jmp r4

r2: inc ebx
jmp r4

r3: inc ecx
jmp r4

r4:
cmp eax,ecx
jnz mn1

push eax
push ebx
push ecx
inc count
call print_n pascal,eax,word ptr 0,word ptr 1,word ptr 1,word ptr 0,word ptr 0
call print_n pascal,ebx,word ptr 0,word ptr 1,word ptr 1,word ptr 0,word ptr 0
call print_n pascal,ecx,word ptr 0,word ptr 1,word ptr 1,word ptr 0,word ptr 0
mov ah,2h
mov dl,32
int 21h

pop ecx
pop ebx
pop eax
mn1:
cmp ecx,9
jz mn2

jmp r3

mn2:
mov ecx,0
cmp ebx,9
jz mn3
jmp r2
mn3:
mov ebx,0
cmp eax,9
jz p4

jmp r1

p4:
;четырехзначные
mov eax,0
mov ebx,0
mov ecx,0
mov edx,0
jmp m5

m1: inc eax
jmp m5

m2: inc ebx
jmp m5

m3: inc ecx
jmp m5

m4: inc edx
jmp m5

m5:
cmp eax,edx
jnz n1
cmp ebx,ecx
jz m7
n1:
cmp edx,9
jz n2

jmp m4

n2:
mov edx,0
cmp ecx,9
jz n3

jmp m3

n3:
mov ecx,0
cmp ebx,9
jz n4

jmp m2

n4:
mov ebx,0
cmp eax,4
jz exit

jmp m1

m7:
inc count

push eax
push ebx
push ecx
push edx

call print_n pascal,eax,word ptr 0,word ptr 1,word ptr 1,word ptr 0,word ptr 0
call print_n pascal,ebx,word ptr 0,word ptr 1,word ptr 1,word ptr 0,word ptr 0
call print_n pascal,ecx,word ptr 0,word ptr 1,word ptr 1,word ptr 0,word ptr 0
call print_n pascal,edx,word ptr 0,word ptr 1,word ptr 1,word ptr 0,word ptr 0

mov ah,2h
mov dl,32
int 21h

pop edx
pop ecx
pop ebx
pop eax

jmp n1

exit:
call print_n pascal,word ptr count,word ptr 0,word ptr 1,word ptr 1,word ptr 0,word ptr 0
mov ah,4ch
int 21h


print_n proc near ;Процедура вывода десятичного числа на экран и в файл
locals @@
arg beg,zero,f_handle,pp0,num_off:word,numb:dword=arg_size

;Аргументы процедуры:
;numb: число(dword)
;num_off: смещение строки, где содержится число(word)
;pp0: 0-не печатать, 1-на экран, 2-в файл(word)
;f_handle: дескриптор файла(word)
;zero: 0-не печатать ведущие нули(word)
;beg: отступ в знаках от начала печатаемого числа(<=9)(word)

push bp    
mov bp,sp
push eax
push ebx
push cx
push edx
push si

mov cx,10    ;Max длина выводимого числа
mov si,num_off
push cx

@p:
mov byte ptr [si],'0'    ;Заполняем символами '0'
inc si            
loop @p
pop cx
mov eax,numb        ;Представляемое число
mov si,num_off        ;Адрес результата для печати
add si,9
mov ebx,10        ;Делитель для выделения цифры

@@pr:
mov edx,0
div ebx
add dl,'0'        ;Переводим символ в цифру
mov byte ptr [si],dl
or eax,eax        ;eax=0?
jz short @@pr2
dec si
loop @@pr

@@pr2:            ;В si фдрес первой ведущей ненулевой цифры
cmp pp0,0        ;Признак печати=0? Да-
je @@e6        ;Выход без печати
mov ah,40h        ;Нет-печать числа

mov cx,10        ;Max длина числа
mov dx,offset num_off    
mov bx,1        ;Дескриптор экрана
cmp pp0,2
je @@e1
jmp short @@e2

@@e1:
mov bx,f_handle     ;Дескриптор файла

@@e2:
cmp zero,0
jne short @@e3
add cx,dx         ;Помещаем в cx адрес первой ненулевой цифры
sub cx,si
mov dx,si
jmp short @@e4

@@e3:
sub cx,beg        ;Ведущие нули
add dx,beg

@@e4:
int 21h

@@e6:
pop si
pop edx
pop cx
pop ebx
pop eax
mov sp,bp        ;Восстанавливаем указатель стека к моменту выхода
pop bp
ret arg_size

print_n endp    
count dw ?
ent db ' '
fn db 'asm.txt',0
fnd dw ?
end begin
Автор: rain87
Дата сообщения: 04.01.2007 18:05
Qwezar
лень код смотреть, вопрос навскидку - файл не забываете закрывать?
Автор: TaHIOIIIkA
Дата сообщения: 08.01.2007 15:20
rain87
большое спасибо!
Поможешь со второй, plzzzz?=)
Автор: rain87
Дата сообщения: 08.01.2007 15:40
TaHIOIIIkA
щас помогу

Добавлено:
блин. слушай, а обязательно делать перестановку строк? имхо проще сделать массив индексов, т.е. 1й элемент обозначает, какая строка стоит на 1м месте, 2й - какая на 2м и т.д.

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

если же надо обязательно перемещать строки (хоть это и тупость), то надо делать строки фиксированной длины - т.е. не любой, а жёстко заданной. иначе перемещение строк будет сущим кошмаром

Добавлено:
если надо всё-таки делать с перемещением строк, то скажи, какой длины они должны быть
Автор: TaHIOIIIkA
Дата сообщения: 10.01.2007 10:55
rain87

Делай как тебе удобней!!
Надеюсь, препод оценит рациональный подход...=)
Автор: rain87
Дата сообщения: 10.01.2007 22:42
TaHIOIIIkA
тады [more=вот]
Код: write macro s
lea dx,s
mov ah,9
int 21h
endm
sseg segment stack
db 64 dup(?)
sseg ends
dseg segment
cnt dw 0
offs dw str_arr,255 dup(?)
str_arr db 60000 dup(?)
idx_arr db 255 dup(?)
mlen db 255
alen db ?
str db 255 dup(?)
ln db 13,10,'$'
dseg ends
cseg segment
assume cs:cseg,ss:sseg,ds:dseg
strcmp proc near;in: ah=idx_s1, al=idx_s2; out: ax=1/0/-1, s1>=<s2
push bx cx
xor bx,bx
mov bl,al
shl bl,1
mov cx,offs[bx+2]
mov si,offs[bx]
sub cx,si


xor bx,bx
mov bl,ah
shl bl,1
mov dx,offs[bx+2]
mov di,offs[bx]
sub dx,di
;[si]->s1; [di]->s2; cx=strlen(s1); dx=strlen(s2);
cmp cx,dx
jle s1longer
mov cx,dx
s1longer:
repe cmpsb
mov ah,[si-1]
mov al,[di-1]
cmp ah,al
jg s1gr
je eq
mov ax,-1
jmp _ret
s1gr:
mov ax,1
jmp _ret
eq:
xor ax,ax
_ret:
pop cx bx
ret
strcmp endp
main proc far
push ds
xor ax,ax
push ax
mov ax,dseg
mov ds,ax
mov es,ax
;-------------
input:
mov ah,10
lea dx,mlen
int 21h;read string
write ln
xor ch,ch
mov cl,alen
test cl,cl;is string empty?
jz in_over
lea si,str;prepare for copy string to array
mov bx,cnt
shl bx,1
mov di,offs[bx]
rep movsb;copy string to array
mov byte ptr[di],0
inc di
shr bx,1
mov idx_arr[bx],bl
inc bx
mov cnt,bx
shl bx,1
mov offs[bx],di
jmp input
in_over:
mov cx,cnt
test cx,cx
jnz strings_are
ret
strings_are:
cmp cx,1
je output
dec cx
sort1:
mov bp,cx
xor bx,bx
sort2:
mov ax,word ptr idx_arr[bx]
call strcmp
cmp ax,1
jne next_iter
mov ax,word ptr idx_arr[bx]
xchg ah,al
mov word ptr idx_arr[bx],ax
next_iter:
inc bx
loop sort2
mov cx,bp
loop sort1
mov cx,cnt
output:
mov bx,cnt
sub bx,cx
mov bl,idx_arr[bx]
shl bx,1
mov di,offs[bx+2]
mov byte ptr[di-1],'$'
mov dx,offs[bx]
mov ah,9
int 21h
write ln
loop output
;-------------
ret
main endp
cseg ends
end main
Автор: Sagev
Дата сообщения: 11.01.2007 23:06
Помогите сделать программу ужас как надо:
1.Вывести на экран фамилию спортсмена занявшего первое место на 3 соревнованиях, его квалификацию, фамилию его тренера.

2Тоже самое тока что бы он фамилию спортсмена сохранял в файл sportsme.dat
Автор: rain87
Дата сообщения: 11.01.2007 23:48
от подобных формулировок условия возникает большое желание выматерится
Sagev
вот, пожалуйста, решение 1й задачи
Код: sseg segment stack
db 64 dup(?)
sseg ends
dseg segment
str db 'Спортсмен Квалификация Фамилия тренера',13,10
db 'Вася Пупкин Супермен Пуся Вапкин',13,10,'$'
dseg ends
cseg segment
assume cs:cseg,ss:sseg,ds:dseg
main proc far
push ds
xor ax,ax
push ax
mov ax,dseg
mov ds,ax
;-------------
lea dx,str
mov ah,9
int 21h
;-------------
ret
main endp
cseg ends
end main
Автор: Sagev
Дата сообщения: 12.01.2007 19:10
Да согласен не правильно сформулировал задачу
Программа вида
Вводиться пять спортсменов
Номер спортсмена Его квалификация Имя тренера последние три места на соревнованиях
Программа выбирает одного который занял 1 места на этих соревнованиях и вывдит его на экран.

Вторая же программа делает то же самое но в нее добавляеться сохранение в файл.

Вот более точная формулеровка, спасибо вам за то что помогаете
Автор: maina
Дата сообщения: 17.01.2007 15:17
помогите,пожалуйста.
мне нужно решить 3 задачки по ассемблеру.
они очень простые для тех,кто хоть что-то знает. А я в этом ничего не понимаю.
Очень нужно...
Задача 1
Дан массив, состоящий из N слов. Поменять местами в каждом слове старшие и младшие четыре бита.
Задача 2
В исходной строке оставить слова, имеющие ту же длину, что и первое слово.
Задача 3
Зашифровать файл по ключу, используя команду xor. Имя файла задается в командной строке, а ключ вводится в процессе работы программы.
Автор: rain87
Дата сообщения: 18.01.2007 21:55
maina
в 1 задаче надо делать ввод/вывод массва? если да, то в каком виде - десятичные, шестнадцетиричные цифры?
Автор: veronica b
Дата сообщения: 20.01.2007 10:35
maina
Если у вас есть компилятор Borland 4.52, то вы можете написать программу на Си. отладить ее, а потом сама среда вам пребразует текст программы на Си в Assembler language. Я всегда так делал!
Автор: rain87
Дата сообщения: 20.01.2007 13:59
maina
писать мне в лс необязательно
Цитата:
По Задаче 1 все,что знаю нужно делать,это:
Работа данной программы может быть продемонстрирована только с использованием средств отладчика, так как она не содержит средств ввода-вывода данных. Исходные данные задаются в тексте программы с помощью директив определения данных. Результат работы также записывается в заданные адреса памяти. Варианты первой задачи предусматривают обработку числовых массивов (знаковых или беззнаковых в размере байта или слова). Результат может формироваться в виде одного байта или слова, а также в виде массива. Определение размеров массивов должно производится ассемблером с помощью специальных директив, так чтобы изменение размера массива производилось путем простого добавления или удаления байтов (слов) без изменения констант.
решение, к примеру [more=такое]
Код: sseg segment stack ;объявление стека размером 64 байта
db 64 dup(?)
sseg ends
dseg segment ;объявление сегмена данных
arr dw 1,2,3,4,5,6,7 ;обрабатываемый массив
narr dw narr-arr-2 ;смещение последнего элемента массива относительно начала массива; т.е. т.к. массив состоит из слов
;(каждое слово 2 байта), фактически тут записано количество_элементов_массива*2-2
;-2 нужно, т.к. индексация массива начинается с 0 (т.е. 1й элемент - arr[0])
result_arr dw 255 dup(?) ;результирующий массив
dseg ends
cseg segment ;программный сегмент
assume cs:cseg,ss:sseg,ds:dseg ;директива компилятору, чтобы он знал какие сегменты считать сегментами стека, данных и кода
main proc far ;основная процедура
push ds ; |
xor ax,ax ;|
push ax ; |сохранение адреса возврата из программы (ret в конце программы вернёт управление по этому адресу) - на начало
; PSP. короче, эта магия необходима, и без неё никак
mov ax,dseg ;|
mov ds,ax ; |инициализация сегмента данных
;-------------
mov si,narr ;запись в si адреса последнего элемента массива
mov cl,4 ;нужно, чтобы потом выполнять логические сдвиги на 4 бита
process:
mov ax,arr[si] ;в ax записываем элемент, на который указывает si
mov bx,ax ;копируем ax в bx
and bx,0f00fh ;в bx обнуляем все биты, кроме старших 4х и младших 4х
and ax,0ff0h ;в ах обнуляем младшие 4 и старшие 4 бита
shr bh,cl ;сдвигаем старшие биты в младший адрес, чтоб потом записать их в младшие биты
shl bl,cl ;сдвигаем младшие биты в старший адрес, чтоб потом записать их в старшие биты
or ah,bl ;запись старших битов на место младших
or al,bh ;запись младших битов на место старших
mov result_arr[si],ax ;запись обработанного элемента в результирующий массив
sub si,2 ;переход к следующему элементу (т.е. к элементу, стоящему перед текущим)
jns process ;если si>=0 то продолжить обработку
;-------------
ret ;возврат из программы
main endp
cseg ends
end main ;указание линковщику, какая процедура является главной
Автор: rain87
Дата сообщения: 20.01.2007 16:21
maina
[more=3 задача]
Код: write macro s
lea dx,s
mov ah,9
int 21h
endm ;макрос для вывода строки
sseg segment stack
db 64 dup(?)
sseg ends
dseg segment
mlen db 100
alen db ?
key db 100 dup(?) ;для ввода ключа с клавиатуры
fname db 255 dup(?) ;сюда копируется имя файла из командной строки
buf db 100 dup(?) ;сюда читаются данные из файла
s0 db 13,10,'Enter the crypt key: $'
s1 db 'Error opening file',13,10,'$'
s2 db 13,10,'Press any key...',13,10,'$'
s3 db 'Crypting file $'
s4 db 13,10,'File succesfully crypted$'
dseg ends
cseg segment
assume cs:cseg,ss:sseg,ds:dseg
main proc far
;командная строка хранится в PSP, по смещению 80h. 1й байт - длина командной строки, остальные байты - сама командная строка
;изначально, до инициализации, регистры es и ds указывают на начало PSP
;чем мы цинично и пользуемся =)
push ds
xor ax,ax
push ax
mov ax,dseg
mov es,ax ;es указывает на сегмент данных, ds - на PSP
;-------------
mov cl,ds:[80h] ;в cl записываем длину командной строки
xor ch,ch ;обнуляем ch, чтоб сх был равен cl
mov si,82h ;si указывает на начало командной строки
lea di,fname ;di указывает на fname
rep movsb ;копируем командную строку в fname
mov ds,ax ;инициализируем регистр ds
mov byte ptr[di-1],0 ;в fname в конец дописываем 0 (нужно, ибо функция открытия файла требует, чтоб в конце имени был 0)

lea dx,fname
mov ax,3d02h ;функция открытие файла в режиме чтения/записи
int 21h ;вызываем прерыванеи ДОС
mov byte ptr[di-1],'$' ;в fname в конец дописываем символ $ (ибо 9 функция вывода строки требует, чтоб строка заканчивалась $)
jnc ok ;если открыли без ошибок, то переходим на ok
write s1 ;иначе - матюкаемся
write fname
jmp readkey ;и валим
ok:
mov bx,ax ;запоминаем дескриптор файла, возвращённый ДОСом
write s3 ;чего-то пишем
write fname
write s0
lea dx,mlen
mov ah,10
int 21h ;и читаем ключ

crypting:
mov cl,alen
xor ch,ch ;в СХ - длина ключа
mov ah,3fh
lea dx,buf
int 21h ;читаем из файла в buf столько байт, сколько длина ключа
mov bp,ax ;в АХ - количество реально прочитанных байт; копируем его в bp
mov cx,ax ;и в СХ
xor si,si ;а si - обнуляем
crypt:
mov al,buf[si] ;читаем очередной считанный байт
xor al,key[si] ;ХОРим его с очередным байтом ключа
mov buf[si],al ;и пишем обратно
inc si ;переходим к следующему байту
loop crypt ;да, переходим
mov dx,bp ;в dx - количество считанных байт
neg dx ;делаем его отрицательным
mov cx,0ffffh ;и СХ делаем отрицательным
mov ax,4201h ;функция перемещения указателя файла на ту позицию, с которой считали наш buf
int 21h ;вызываем прерывание для выполнения функции

lea dx,buf
mov cx,bp
mov ah,40h
int 21h ;пишем буфер обратно (но уже зашифрованный)
mov ax,bp
cmp al,alen ;сравниваем количество обработанных (считанных, зашифрованных и записанных) байт с длиной ключа
je crypting ;если равны - продолжаем обработку

mov ah,3eh ;иначе - достигнут конец файла
int 21h ;закрываем его
write s4
;-------------
readkey:
write s2
xor ah,ah
int 16h
ret
main endp
cseg ends
end main
Автор: ushankin
Дата сообщения: 21.01.2007 15:46
В универе дали задачку, а я в ассемблере совсем не разбираюсь, может кто-нибудь напишет хотя бы алгоритм решения.

"На языке ассемблера разработать алгоритм контроля на четность массива данных, хранящегося в некоторой области памяти. Код четности должен быть сохранен для последующей периодической проверки массива данных. В случае несовпадения на экран должно выводиться сообщение об искажении данных."

Спасибо =)

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384

Предыдущая тема: .NET GUI компоненты


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.