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

» Assembler

Автор: Krizzly
Дата сообщения: 15.12.2010 19:28
Доброго времени суток. Прошу помощи программистов. Написал программу озвучивания клавиш клавиатуры:


masm
.model small
.stack 256
.data
Msg_about db 'Нажми на кнопку и пикнет', 0Ah, 0Dh, '$'

.code

start:
; Инициализация сегментного регистра ds
mov ax, @data
mov ds, ax

; Видеорежим 3 (очистка экрана и установка курсора в 0, 0)
mov ax, 0003h
int 10h

; Вывод сообщения на экран
mov ah, 9
mov dx, offset Msg_about
int 21h


; Чтение символа с ожиданием
mov ah, 0
int 16h


mov ah, 2 ; Вывод символа
mov dl, 7 ; Сигнал
int 21h

; Завершение программы, возврат управления ОС
exit:
mov ax, 4c00h
int 21h
end start


Но нужно сделать ее резидентной, чтобы не вылетало после одного нажатия. Не получается сделать этого. Помогите пожалуйста
Автор: bomzzz
Дата сообщения: 15.12.2010 19:36
Krizzly
http://kalashnikoff.ru/Assembler/
у калашникова прекрасно расписано как делать резидента, с примерами. я прочел и все получилось. ничего сложного

Добавлено:
вот пример простейшего резидента. нашел в инете гуглой. но это я уже чета попеределывал.

Цитата:

;prog.asm
;делаем COM-файл
;tasm prog.asm
;tlink prog /t
;запускаем в командном интерпретаторе cmd.exe

    .model    tiny        ;модель для COM-программы (все в одном сегменте)
    .code            ;сегмент кода
    .startup        ;макро для настройки старта программы
    jmp    init        ;на инициализацию резидента
old_09    dw    0, 0        ;здесь будет старый клавиатурный вектор 9
new_09:                ;новая отработка вектора 9
    push    ax        ;надо сохранять все используемые регистры (для начала только ax)
    in    al, 60h        ;прочитаем код из клавиатуры
    cmp    al, 3bh        ;F1 ?
    jne    to_old_09    ;если не F1, то на старый вектор


    push    bx
    push    cx        ;сохраним еще cx
    push    dx
    push    ds
    push    es
    push    ss
    push    sp
    push    bp
    push    si
    push    di


    mov    ah, 5        ;функция записи в буфер клавиатуры
    mov    cx, 'F'        ;ch=0 - скан-код нам не нужен, cl=ASCII-код
    int    16h
    cmp    al, 0        ;проверим на ошибку
    jne    to_iret        ;если ошибка, то больше в буфер не писать
    mov    ah, 5
    mov    cx, '1'
    int    16h
    cmp    al, 0
    jne    to_iret
    mov    ah, 5
    mov    cx, '.'
    int    16h
    cmp    al, 0
    jne    to_iret
    mov    ah, 5
    mov    cx, 'B'
    int    16h
    mov    ah, 5        ;функция записи в буфер клавиатуры
    mov    cx, 'A'        ;ch=0 - скан-код нам не нужен, cl=ASCII-код
    int    16h
    cmp    al, 0        ;проверим на ошибку
    jne    to_iret        ;если ошибка, то больше в буфер не писать
    mov    ah, 5
    mov    cx, 'T'
    int    16h
    cmp    al, 0
    jne    to_iret

    mov    ah, 5        ; ENTER
    mov    cx, 0Dh
    int    16h
to_iret:

    pop    di
    pop    si
    pop    bp
    pop    sp
    pop    ss
    pop    es
    pop    ds
    pop    dx
    pop    cx        ;восстановим cx
    pop    bx

to_old_09:
    pop    ax        ;восстановим ax
    jmp    dword ptr cs:old_09 ;на старый вектор
init:                ;инициализация программы
    mov    ax, 3509h    ;прочитаем старый вектор
    int    21h
    mov    old_09, bx    ;сохраним в переменной смещение
    mov    old_09+2, es    ; и сегмент
    mov    ax, 2509h    ;установим новый вектор отработки прерывания 9
    lea    dx, new_09    ; адрес нового обработчика
    int    21h
    lea    dx, init    ;последний адрес программы, который оставляем в памяти
    int    27h        ;оставляем резидент в памяти и завершаемся

    end



Добавлено:
лучше оригинал погуглить. тут какой то промежуточный вариант. явно проверял какие регистры разрушаются. конечно надо popa pusha использовать
Автор: Abs62
Дата сообщения: 15.12.2010 20:46
Van_der_Vlaad

Цитата:
Напишите, пожалуйста пример передачи параметров в процедуру через регистры на ассемблере.

А что, собственно, непонятно? Как значения в регистр записать? Или как процедуру вызвать?

Цитата:
Пробовал искать в интернете и книгах, в интернете буквально пару слов об этом и нету примеров нормальных, а в книге какой то пример слишком запутанный.

А какие там особые примеры нужны? Практически любая программа - это готовый пример. Вот только что bomzzz код кинул - там видно, как заносятся значения в регистры и вызывается прерывание. Мысленно подставь call вместо int - вот и искомый пример.
Автор: bomzzz
Дата сообщения: 15.12.2010 20:57
у калашникова шикарно это расписано. вообще там почти половина посвещена резидентам. в двух словах это выглядит так, в первом килобайте памяти записана таблица прерываний - адреса памяти на которые осуществляется переход по каждому нумеру прерывания . в досе есть специальные прерывания, чтоб эту таблицу переписывать. вот и переписываешь эту таблицу так, чтоб сначала переход на твой адрес был осуществлен. и есть специальное прерывание доса который позволяет завершить программу не освобождая память. вот и все.
Автор: A1exSun
Дата сообщения: 15.12.2010 21:17
Уважаемые, помогите с BCD системой счисления.

A = 66D = 0110 0110 BCD
ПК 0101 1000
ОК 1010 0111
ДК 1010 1000

B = 58D = 0101 1000 BCD
ПК 0110 0110
ОК 1001 1001
ДК 1001 1010

Нужно посчитать:
A-B = ?
B-A = ?

Пробую - ну никак не выходит 8 и -8. A+B получилось, сошлось.
Автор: Abs62
Дата сообщения: 15.12.2010 22:04
A1exSun
Посмотри команду DAS.
Автор: A1exSun
Дата сообщения: 15.12.2010 22:11
Abs62
у меня ассемблер МП Intel 8080, в нем нету такой команды.
А это вначале нужно написать в столбик ручками, а уже потом писать программу, которая будет делать эти действия
Но с ней у меня проблем не будет, если ручками разберусь.

Добавлено:
Пример нашел только сложение в википедии.
Вычитание обычной двоичной системы плохо уже помню, вроде делал все правильно (одно из чисел переводил в ОК, потом в ДК, вычитание заменял сложением), а ответ не сходится.
Кому не сложно, распишите пожалуйста те 2 примера.
Автор: A1exSun
Дата сообщения: 16.12.2010 18:31
Разобрался.
Автор: Van_der_Vlaad
Дата сообщения: 21.12.2010 20:03
Здравствуйте, уважаемые форумчане.

Быстрая сортировка на ассемблере.

Вот алгоритм на паскале, который я переделывал под ассемблер. (стандартный алгоритм, с рекурсией)
[more=Pascal QuickSort]procedure Quicksort;

procedure sort(l,r:index);

var I,j:index; x,w:item;

begin i:=l; j:=r; x:=a[(l+r) div 2]

repeat while a[i]<x do i:=i+1;

while x<a[j] do j:=j-1;

if i<=j then begin w:=a[i]; a[i]:=a[j]; a[j]:=w; i:=i+1; j:=j-1; end;

until i>j

if l<j then sort(l,j);

if i<r then sort(I,r);

end;{---------}

begin sort(1,n); end;[/more]

А вот код на ассемблере (делал на TASM)
[more=QuickSort Asm]SST SEGMENT STACK "STACK"
dw 1000 dup (?)
SST ENDS

DAT SEGMENT
msg_ish_mas db "Ishodnii massiv: ", "$"
msg_otsrt_mas db 0ah,0dh,"Otsortirovannie elementi massiva: ", "$"

mas db 3,7,8,5,2,0,1,6,4 ;9 kol-vo elem
n = $-mas
i dw 0
j dw 0
z db 0

DAT ENDS

COD SEGMENT

assume SS:SST, DS:DAT, CS:COD

Begin:

mov ax, DAT     
mov ds, ax

mov ax, 03 ; Очистка экрана
int 10h        

push 0 ; возможная ошибка - неправильные границы. (n-1 ?)
push n-1 ; n / n-1

call quicksort

mov ah,4ch ; Корректное завершение нашей программы
int 21h     

;-----------
quicksort proc

push bp ; "Пролог"
mov bp,sp

mov si,4
mov bx,[bp+si] ; N правая граница (ah)bx ;mov j,..
add si,2
mov ax,[bp+si] ; 1 левая граница (al)ax ; mov i,....

mov i, ax
mov j, bx

mov cx,ax
mov dx,bx

add ax,bx ; ax = l+r
mov bl,2 ;delitel
div bl
mov ah,0
mov si, ax
mov al, mas[si] ; ax:=a[(l+r) div 2]

rpt:

    while_bg1:
mov si,i
        cmp mas[si],al
        jnae while_end1 ;a[i]<x
        inc i
        jmp while_bg1

    while_end1:

    while_bg2:
mov si,j
        cmp al,mas[si]
        jnae while_end2 ;x<a[j]
        dec j
        jmp while_bg2
    while_end2:

    mov ax,i
mov bx,j    
    cmp ax,bx
    jnbe m3;i>j
     push cx
         mov si,ax
         mov cl, mas[si]
            mov z,cl
mov si,bx            
            mov cl, mas[si]
mov si,ax            
            mov mas[si], cl
            mov cl,z
            mov si,bx
            mov mas[si], cl
pop cx            
inc i
inc j        
    
    m3:
    
mov ax,i
cmp ax,j    
jna rpt ;i>j

cmp cx,j
jnae m1

cmp i,dx
jnae m2

jmp end_proc

m1:
push cx
push j
call quicksort

m2:
push i
push dx
call quicksort

end_proc:
mov sp,bp
pop bp

ret
quicksort endp
;------------

COD ENDS
END Begin [/more]

Ошибка следующая - компиляция нормальная, при запуске вылетает с такой ошибкой


Смотрел в отладчике - ошибка возникает где-то поздно, не на ранних циклах и рекурсии.

Если у вас возникнут вопросы по коду - задавайте, постараюсь объяснить что я там хотел сделать.

Также по следующей ссылке прикладываю сам компилятор TASM.
(Сама программа находится в файле prog.asm, просто скомпилировать - asm.bat, запустить - asm_debug.bat и нажать f9. ну а остальное стандартное, всякие f7, f8...)
http://ifolder.ru/20944619

Заранее спасибо за помощь!
Автор: akaGM
Дата сообщения: 21.12.2010 20:30
Van_der_Vlaad
какой у тебя предполагаемый интерфейс quicksort(), quicksort([var] l_index, r_index: word)?

Код: push 0 ; возможная ошибка - неправильные границы. (n-1 ?)
push n-1 ; n / n-1
call quicksort
push bp ; "Пролог"
mov bp,sp

mov si,4
mov bx,[bp+si]
Автор: pavelkorr
Дата сообщения: 22.12.2010 11:47
Добрый день, помогите пожалуйста написать программу. Принцип действия таков:
Программа запрашивает у пользователя ввод числа от 0 до 9, по окончанию ввода компьютер считывает значение секунды из CMOS (именно старшее значение, чтобы всегда было от 0 до 9). Компьютер сравнивает введённое пользователем значение со считанным из CMOS. В случае совпадения выводится сообщение типа "Ура! Вы угадали", в случае неудачи, соответственно, "Ура! Вы не угадали!"

Вот немного из набросков:

Код:
.model large
.386
.387
;------------------------ сегмент кода -------------------------------
.code ; сегмент кода
mov AX, @data
mov DS, AX
mov ES, ax

lea DX, s1

mov AH, 9h ; 09h - функция вывода на экран
int 21h

call in_out ; изучение команд работы с портами
call fproc ; изучение команд матем. сопроцессора

mov AH, 1h ; 01h - функция ожидания ввода с клавиатуры
int 21h


mov ax, 4c00h ; корректное завершение программы
int 21h
ret

fproc PROC near
finit ; инициализация сопроцессора
fild word ptr zoom ; загрузим в стек 50000
; здесь можно проверить правильность загрузки командой: fbstp tbyte ptr decimal
fldpi ; pi,50000
fldpi ; pi,pi,50000
fmul ; pi*pi,50000
fcos ; cos(pi*pi), 50000
fmul ; 50000*cos(pi*pi)
fld st(0) ; copy
fst qword ptr myfloat ; сохраним в памяти как переменную типа double
fbstp tbyte ptr decimal ; сохраним в памяти как десятичное целое

lea si,numbers ; вывод на экран десятичного числа
lea di,decimal
add di,9

mov cx,10d

f_loop:
mov al,[di]

mov ah,al ; сделаем копию в ah

shr al,4 ; обработка первого числа
add al,'0'
mov [si],al ; сохранили

and ah,00001111b
add ah,'0'
mov [si+1],ah ; сохранили

dec di
add si,2
dec cx
jnz f_loop

lea DX, math
mov AH, 9h ; 09h - функция вывода на экран
int 21h


ret
fproc ENDP

;=====================================================================
;=== Процедура считывания из микросхемы CMOS текущего времени
;=====================================================================

in_out PROC near

PR_CMOS MACRO NUM,ADDR
mov al,NUM ; считаем из CMOS час
lea si,ADDR
call print_cmos
ENDM

mov al,0bh ; подготовка к взаимодействию с микросхемой CMOS
out 70h,al
in al,71h
and al,11111011b
out 71h,al

PR_CMOS 0h,secondh ; считаем из CMOS старшую часть секунды

lea DX, s_d
mov AH, 9h ; 09h - функция вывода на экран
int 21h
ret
in_out ENDP

print_cmos PROC near
; входные параметры
; al - номер регистра CMOS
; si - адрес символьного буфера куда помещаем результат

out 70h,al ; считаем из CMOS
in al,71h

mov ah,al ; сделаем копию в ah

shr al,4 ; обработка первого числа
add al,'0'
mov [si],al ; сохранили

and ah,00001111b
add ah,'0'
mov [si+1],ah ; сохранили
ret
print_cmos ENDP

;-------------------------- Сегмент данных -------------------------
.data ; сегмент данных

s_d db 10,13,10,13,' Загаданное число: '

secondh db ?,?
db '$'
Автор: Van_der_Vlaad
Дата сообщения: 22.12.2010 18:46
akaGM
Спасибо за помощь!
Попробовал исправить программу, теперь она выглядит так.
[more=QuickSort]SST SEGMENT STACK "STACK"
dw 1000 dup (?)
SST ENDS

DAT SEGMENT
msg_ish_mas db "Ishodnii massiv: ", "$"
msg_otsrt_mas db 0ah,0dh,"Otsortirovannie elementi massiva: ", "$"

mas db 3,7,8,5,2,0,1,6,4 ;9 kol-vo elem
n = $-mas
i dw 0
j dw 0
z db 0

DAT ENDS

COD SEGMENT

assume SS:SST, DS:DAT, CS:COD

Begin:

mov ax, DAT     
mov ds, ax

mov ax, 03 ; Очистка экрана
int 10h        

push 0 ; возможная ошибка - неправильные границы. (n-1 ?)
push n-1 ; n / n-1

call quicksort

    mov ah,9
    lea dx, msg_otsrt_mas ; Выводим сообщение message2
    int 21h

    mov cx, n ; В цикле выводим элементы отсортированного массива
    mov si,0
    mov    ah,02h
    
    m9:
     mov dl, mas[si]
     add dl,30H
     int 21H

     mov dx, " "
     int 21H             
                        
     add si,1
    loop m9

mov ah,4ch ; Корректное завершение нашей программы
int 21h     

;-----------
quicksort proc near
LOCALS @@
L_ind EQU WORD PTR [BP+6]
R_ind EQU WORD PTR [BP+4]

push bp ; "Пролог"
mov bp,sp

;mov si,4
mov bx, R_ind ; N правая граница (ah)bx ;mov j,..
;add si,2
mov ax, L_ind ; 1 левая граница (al)ax ; mov i,....

mov i, ax
mov j, bx


add ax,bx ; ax = l+r
mov bl,2 ;delitel
div bl
mov ah,0
mov si, ax
mov al, mas[si] ; ax:=a[(l+r) div 2]

rpt:

    while_bg1:
mov si,i
        cmp mas[si],al
        jnae while_end1 ;a[i]<x
        inc i
        jmp while_bg1

    while_end1:

    while_bg2:
mov si,j
        cmp al,mas[si]
        jnae while_end2 ;x<a[j]
        dec j
        jmp while_bg2
    while_end2:

    mov ax,i
mov bx,j
    cmp ax,bx
    jnbe m3;i>j
     push cx
         mov si,ax
         mov cl, mas[si]
            mov z,cl
mov si,bx            
            mov cl, mas[si]
mov si,ax            
            mov mas[si], cl
            mov cl,z
            mov si,bx
            mov mas[si], cl
pop cx            
inc i
inc j
    
    m3:
    
mov ax,i
cmp ax,j    
jna rpt ;i>j

mov cx,L_ind
mov dx,R_ind

cmp cx,j
jnae m1

cmp i,dx
jnae m2

jmp end_proc


m1:
push cx
push j
call quicksort

m2:
push i
push dx
call quicksort

end_proc:
mov sp,bp
pop bp

ret
quicksort endp
;------------

COD ENDS
END Begin [/more]

Добавилось вот это

Код:
quicksort proc near
LOCALS @@
L_ind EQU WORD PTR [BP+6]
R_ind EQU WORD PTR [BP+4]


push bp
mov bp,sp

;mov si,4
mov bx, R_ind ; N правая граница (ah)bx ;mov j,..
;add si,2
mov ax, L_ind ; 1 левая граница (al)ax ; mov i,....

mov i, ax
mov j, bx
Автор: Abs62
Дата сообщения: 22.12.2010 19:30
Van_der_Vlaad

Цитата:
mov i, ax
mov j, bx

И что будет происходить с глобальными переменными i и j при рекурсивном вызове?

Код:
LOCALS @@ ; Это обычно пишется в самом начале программы - инструкция компилятору как трактовать все вхождения с @@
...
quicksort proc near
@@L_ind EQU WORD PTR [BP+6]
@@R_ind EQU WORD PTR [BP+4]

@@i EQU WORD PTR [BP-2]
@@j EQU WORD PTR [BP-4]

push bp
mov bp,sp
sub sp,4 ; выделение места под локальные переменные @@i, @@j
...
mov @@i, ax
mov @@j, bx
...
Автор: Van_der_Vlaad
Дата сообщения: 22.12.2010 20:04
Abs62
вот мой очередной вариант
[more=Quick]SST SEGMENT STACK "STACK"
dw 1000 dup (?)
SST ENDS

DAT SEGMENT
msg_ish_mas db "Ishodnii massiv: ", "$"
msg_otsrt_mas db 0ah,0dh,"Otsortirovannie elementi massiva: ", "$"

mas db 3,7,8,5,2,0,1,6,4 ;9 kol-vo elem
n = $-mas
i dw 0
j dw 0
z db 0

DAT ENDS

COD SEGMENT

assume SS:SST, DS:DAT, CS:COD

LOCALS @@

Begin:

mov ax, DAT     
mov ds, ax

mov ax, 03 ; Очистка экрана
int 10h        

push 0 ; возможная ошибка - неправильные границы. (n-1 ?)
push n-1 ; n / n-1

call quicksort

    mov ah,9
    lea dx, msg_otsrt_mas ; Выводим сообщение message2
    int 21h

    mov cx, n ; В цикле выводим элементы отсортированного массива
    mov si,0
    mov    ah,02h
    
    m9:
     mov dl, mas[si]
     add dl,30H
     int 21H

     mov dx, " "
     int 21H             
                        
     add si,1
    loop m9

mov ah,4ch ; Корректное завершение нашей программы
int 21h     

;-----------
quicksort proc near
@@L_ind EQU WORD PTR [BP+6]
@@R_ind EQU WORD PTR [BP+4]

@@i EQU WORD PTR [BP-2]
@@j EQU WORD PTR [BP-4]

push bp ; "Пролог"
mov bp,sp
sub sp,4 ; выделение места под локальные переменные @@i, @@j

;mov si,4
mov bx, @@R_ind ; N правая граница (ah)bx ;mov j,..
;add si,2
mov ax, @@L_ind ; 1 левая граница (al)ax ; mov i,....


mov @@i, ax
mov @@j, bx


add ax,bx ; ax = l+r
mov bl,2 ;delitel
div bl
mov ah,0
mov si, ax
mov al, mas[si] ; ax:=a[(l+r) div 2]

rpt:

    while_bg1:
mov si,@@i
        cmp mas[si],al
        jnae while_end1 ;a[i]<x
        inc @@i
        jmp while_bg1

    while_end1:

    while_bg2:
mov si,@@j
        cmp al,mas[si]
        jnae while_end2 ;x<a[j]
        dec @@j
        jmp while_bg2
    while_end2:

    mov ax,@@i
mov bx,@@j
    cmp ax,bx
    jnbe m3;i>j
     push cx
         mov si,ax
         mov cl, mas[si]
            mov z,cl
mov si,bx            
            mov cl, mas[si]
mov si,ax            
            mov mas[si], cl
            mov cl,z
            mov si,bx
            mov mas[si], cl
pop cx            
inc @@i
inc @@j
    
    m3:
    
mov ax,@@i
cmp ax,@@j    
jna rpt ;i>j

mov cx,@@L_ind
mov dx,@@R_ind

cmp cx,@@j
jnae m1

cmp @@i,dx
jnae m2

jmp end_proc


m1:
push cx
push @@j
call quicksort

m2:
push @@i
push dx
call quicksort

end_proc:
mov sp,bp
pop bp

ret
quicksort endp
;------------

COD ENDS
END Begin [/more]
Теперь вообще работа останавливается судя по отладчику в каких то дебрях (даже не в строках с кодом программы)

Если не затруднит, то напишите, пожалуйста свою полную версию с этими переменными.
А то я с ассемблером работал мало, а с этими переменными вообще первый раз сейчас работаю и представляю сколько у меня сейчас косяков.

Спасибо.
Автор: akaGM
Дата сообщения: 22.12.2010 20:04
Van_der_Vlaad
ещё надо "поправить стек" на два пуша переданных параметров:

Код: ...
end_proc:
mov sp,bp
pop bp

ret 4
quicksort endp
Автор: Van_der_Vlaad
Дата сообщения: 22.12.2010 20:08

Цитата:
Abs62
вот мой очередной вариант
Quick
Теперь вообще работа останавливается судя по отладчику в каких то дебрях (даже не в строках с кодом программы)
 
Если не затруднит, то напишите, пожалуйста свою полную версию с этими переменными.
А то я с ассемблером работал мало, а с этими переменными вообще первый раз сейчас работаю и представляю сколько у меня сейчас косяков.
 
Спасибо.


Цитата:
ещё надо "поправить стек" на два пуша переданных параметров:


после изменения на ret 4 ничего не изменилось. (ошибка в первую очередь скорее всего в моей работе с @@... )
Автор: akaGM
Дата сообщения: 22.12.2010 20:30
Van_der_Vlaad

Цитата:
после изменения на ret 4 ничего не изменилось.

это одна _из_ ошибок...
Автор: Abs62
Дата сообщения: 22.12.2010 22:15
Van_der_Vlaad

Цитата:
а с этими переменными вообще первый раз сейчас работаю и представляю сколько у меня сейчас косяков.

Сравнительно немного.
Не столько с переменными, сколько с условиями. И в одном месте inc вместо dec.
[more]
Код: SST SEGMENT STACK "STACK"
dw 1000 dup (?)
SST ENDS

DAT SEGMENT
msg_ish_mas db "Ishodnii massiv: ", "$"
msg_otsrt_mas db 0ah,0dh,"Otsortirovannie elementi massiva: ", "$"

mas db 3,7,8,5,2,0,1,6,4 ;9 kol-vo elem
n = $-mas
z db 0

DAT ENDS

COD SEGMENT

assume SS:SST, DS:DAT, CS:COD

LOCALS @@

Begin:

mov ax, DAT
mov ds, ax

mov ax, 03 ; Очистка экрана
int 10h

    mov    ax,0
    push    ax
    mov    ax,n-1
    push    ax

    call quicksort

mov ah,9
lea dx, msg_otsrt_mas ; Выводим сообщение message2
int 21h

mov cx, n ; В цикле выводим элементы отсортированного массива
mov si,0
mov ah,02h

m9:
mov dl, mas[si]
add dl,30H
int 21H

mov dx, " "
int 21H

add si,1
loop m9

mov ah,4ch ; Корректное завершение нашей программы
int 21h

;-----------
quicksort proc near
@@L_ind EQU WORD PTR [BP+6]
@@R_ind EQU WORD PTR [BP+4]

@@i EQU WORD PTR [BP-2]
@@j EQU WORD PTR [BP-4]

push bp ; "Пролог"
mov bp,sp
sub sp,4 ; выделение места под локальные переменные @@i, @@j

;mov si,4
mov bx, @@R_ind ; N правая граница (ah)bx ;mov j,..
;add si,2
mov ax, @@L_ind ; 1 левая граница (al)ax ; mov i,....


mov @@i, ax
mov @@j, bx


add ax,bx ; ax = l+r
mov bl,2 ;delitel
div bl
mov ah,0
mov si, ax
mov al, mas[si] ; ax:=a[(l+r) div 2]

rpt:

while_bg1:
mov si,@@i
cmp mas[si],al
jae while_end1 ;a[i]<x
inc @@i
jmp while_bg1

while_end1:

while_bg2:
mov si,@@j
cmp al,mas[si]
jae while_end2 ;x<a[j]
dec @@j
jmp while_bg2
while_end2:

mov ax,@@i
mov bx,@@j
cmp ax,bx
jnbe m3;i>j
push cx
mov si,ax
mov cl, mas[si]
mov z,cl
mov si,bx
mov cl, mas[si]
mov si,ax
mov mas[si], cl
mov cl,z
mov si,bx
mov mas[si], cl
pop cx
inc @@i
dec @@j

m3:

mov ax,@@i
cmp ax,@@j
jle rpt ;i<=j

mov cx,@@L_ind
cmp cx,@@j
jge @@m1

push cx
push @@j
call quicksort

@@m1:
mov dx,@@R_ind
cmp @@i,dx
jge @@m2

push @@i
push dx
call quicksort

@@m2:
mov sp,bp
pop bp

ret 4
quicksort endp
;------------

COD ENDS
END Begin
Автор: Van_der_Vlaad
Дата сообщения: 23.12.2010 16:50
ДА! РАБОТАЕТ!
Огромнейшее спасибо Abs62 и akaGM за проявленное терпение и помощь!
Автор: berkut9737
Дата сообщения: 05.02.2011 15:43
Здравствуйте, простите, если не по теме и если это так, направьте пож., в нужную ветку. Проблема вот в чём. Установил Assembler masm611 на Win-7. Установку делал по умолчанию, т.к, другой инструкции не нашёл. СМD и EDIT файлы работают. Написал по шаблону первую учебную программу, но, когда дело дошло до "слинковать объектные файлы", то дальше дело не пошло. Подскажите, пож., возможную причину. Второй день бьюсь лбом о стену, а воз и ныне там. Спасибо.
Автор: bomzzz
Дата сообщения: 05.02.2011 15:48
давно ниче не делал вот таким батником компилирую. на семерке не пробовал

Цитата:

ECHO OFF
COLOR 9F
CLS
REM C:\MASM611\BIN\ML.EXE NONAME.asm /link C:\MASM611\LIB\MYLIB.LIB
C:\MASM611\BIN\ML.EXE NONAME.asm /AT
pause
C:\MASM611\BINR\LINK.EXE NONAME.obj /t
pause

код в файле NONAME.ASM

Добавлено:
ошибки вылазят но компилиться. при установке не дал масму в системыне пути прописаться может поэтому. я в основном на тасм 4 все делал, только потом на масм 6.11 перебрался. не довел это дело до конца

Автор: berkut9737
Дата сообщения: 05.02.2011 16:10
bomzzz, у меня ничего не получается- я чайник ещё в этом деле. Батник сделал, запустил, но такого рез., как у вас на картинке нет. Можно, последовательную инструкцию? У меня все файлы хранятся в папке source на рабочем столе, туда же я поместил и ваш батник.
Автор: bomzzz
Дата сообщения: 05.02.2011 16:14
не, надо было батник в папку положить с таким же путем как на картинки. или чтоб со стола запускать, тогда надо рабочий путь в батнике менять. но я когда пишу пользуюсь эмулятором поэтому уже конечный вариант только компилирую, поэтому у меня и батник в самом масме прижился

Добавлено:
http://www.emu8086.com/ вот очень пальзительная вечь для начинающих, ключ в инете. правда потом код для масма 6.11 придется незначительно подправлять, а вот тасм и фасм компилят в таком же видее как эмулятор
Автор: berkut9737
Дата сообщения: 05.02.2011 16:17
bomzzz, т.е, работать в папке masm611? А вместо NONAME подставлять имена своих файлов в батнике?
Автор: bomzzz
Дата сообщения: 05.02.2011 16:19
[more]

[/more]
Добавлено:
berkut9737
да. ну можно переделать для удобства. я обычно копирую код в файл нонаме с рабочего стола. для тасма у меня есть батник который из буфера обмена берет код и компилит


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

Добавлено:
надо было еще стек на картинку вывести
Автор: berkut9737
Дата сообщения: 05.02.2011 16:25
bomzzz, спасибо! Буду пока переваривать вашу информацию и практиковать. Вернусь в тему просветлённым(надеюсь), чтобы продолжить обучение.

Добавлено:
bomzzz, уже качаю.
Автор: bomzzz
Дата сообщения: 05.02.2011 16:29
http://bomz-co.narod.ru/tasm4.0.rar пригодица в кулацком хозяйтсве

Автор: bomzzz
Дата сообщения: 06.02.2011 06:10
люди помогите файл пропатчить. задача такая, есть интеловская утилита для перепрошивки флеш памяти сетевой карты. она не позволяет прошивать флеш память, чем попало, видимо какая то проверка по определенным байтам. что я начал делать - сначала разжал файл упсом. после этого при открытии файла в блокноте в нем читается дата - ну то есть можно прочитать хелп, сообщения об ошибках, в принципе раз он расжался то это и означает что он был зажат. при попытке прошить неродной прошивкой выводиться надпись -
Invalid image file [имя файла]
нашел в файле это место - Invalid image file, в 16 ричном редакторе HIEW. заодно дезасемблировал SOURCER - но в принципе он написал, что программа написана не на ассемблере могла фигня получится, и видимо получилась.

и че дальше делать как найти какое место в программе ссылается на эту дату?

http://bomz-co.narod.ru/BootUtil.exe



Добавлено:
может программу резидента написать. прошивальщик, прежде чем начать прошивку спрашивает, создать бекап, вот в этот момент нажать горячую клавишу и подменить файл прошивки. или если он открыт перезаписать его
Автор: bomzzz
Дата сообщения: 06.02.2011 18:08
факир был пьян и фокус не удался. утилита вместе с тем как проверяет прошивку копирует ее в память, и потом пишет оттуда, перезаписывание файла эффекта нужного не дает.
Автор: bomzzz
Дата сообщения: 08.02.2011 07:57
давно понять не могу - почему резиденты мои часто конфликтуют. вот сейчас с волков коммандером конфликтуит. уже вообще все регистры сохранил включая флаги, и все равно. пишу по калашникову. примеров полно в инете.

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384

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


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