Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.08.2015, 14:42   #1
Михо94
Новичок
Джуниор
 
Регистрация: 28.08.2015
Сообщений: 4
По умолчанию Описать близкую процедуру SHIFT_N

Выручайте),до пн надо разобраться, с трудом дается ассемблер, прога есть, не могу понять как она работает, было бы не плохо ее прокоментить..
Вот задание:Описать близкую процедуру SHIFT_N, которой передается начальный адрес некоторого массива из 100 байтов и которая за один просмотр этого массива циклически сдвигает его элементы на N позиции вперед (влево). В своей работе процедура должна использовать вспомогательный массив, отведя ему место в стеке. Выполнить это упражнение при условии, что параметр передается процедуре через регистр.
при создании объектного файла выдает *Warning*lab2.asm(88) Open procedure: SHIFT_N
Вот сама прога:
Код:
 include io.asm
 
s   segment stack
    DB 1024 DUP(?)
s   ends
 
d   segment
sz = 10
N   DW ?
k = 0
A   DB sz dup (?)
msg DB 'Shift: $'
d   ends
 
c   segment
    assume cs:c, ds:d, ss:s
 
start:  mov ax, d
    mov ds, ax
    
    mov cx, sz
    mov bx, 0
l:  mov A[bx], bl
    inc bx
    loop l
 
    mov dx, offset msg
    outstr
    inint N
    newline
    push offset A
    push N
    CALL SHIFT_N
 
    mov cx, sz
    mov si, 0
m:  mov dl, A[si]
    mov dh, 0
    outint dx, 5
    inc si
    loop m
 
    finish
 
 
    SHIFT_N proc near
 
    push bp
    mov bp, sp
    sub sp, sz
    mov si, [bp + 6]
    outint si
    mov di, sp
    outint di
    mov dx, [bp + 4]
    outint dx   
    ; dx - shift
    add di, dx          
    mov ax, sz      
    ; ax - array size
    sub ax, dx          
    mov cx, ax          
l1: mov bl, [si]        
    mov ss:[di], bl
    inc di
    inc si
    loop l1
    mov di, sp          
    mov cx, dx
l2: mov bl, [si]
    mov ss:[di], bl
    inc di
    inc si
    loop l2
    mov cx, sz
    mov si, sp
    mov di, [bp + 6]
l3: mov bl, ss:[si]
    mov [di], bl
    inc di
    inc si
    loop l3
    mov sp, bp
    pop bp
    ret
 
c   ends
    end start
Михо94 вне форума Ответить с цитированием
Старый 29.08.2015, 00:13   #2
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

Цитата:
Сообщение от Михо94 Посмотреть сообщение
при создании объектного файла выдает *Warning*lab2.asm(88) Open procedure: SHIFT_N
Вот сама прога:
Код:
 include io.asm
..чёт непонятный код у тебя. include io.asm существует? Скинь его сюда, чё там есть?
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 29.08.2015, 04:10   #3
Михо94
Новичок
Джуниор
 
Регистрация: 28.08.2015
Сообщений: 4
По умолчанию

Код:
        .xlist  ;этот текст в листинг не выводить
;макрокоманды ввода - вывода, подключаемые к
;программам по директиве include io.asm
;обозначения в тексте
;in - непосредственный операнд длиной n бит
;rn - регистр длиной n бит
;mn - перанд в памяти длиной n бит
;****************************************************************
;             ОКОНЧАНИЕ СЧЕТА ПРОГРАММЫ
;****************************************************************
;================================================================
; Окончание счета программы
;Обращение : finish
;Параметры : нет
;----------------------------------------------------------------
finish  macro
        mov     ah,4Ch
        int     21h
        endm
;****************************************************************
;            ВЫВОД НА ЭКРАН
;****************************************************************
;================================================================
; Переход на новую строку
;Обращение : newline
;Параметры : нет
;----------------------------------------------------------------
extrn   procnl:far
newline macro
        call    procnl
        endm
;================================================================
; Вывод символа
;Обращение : outch c
;Параметры : c - символ i8,r8 или m8
;----------------------------------------------------------------
outch   macro   c
        push    dx
        push    ax
        mov     dl,c
        mov     ah,2
        int     21h
        pop     ax
        pop     dx
        endm
Михо94 вне форума Ответить с цитированием
Старый 29.08.2015, 04:10   #4
Михо94
Новичок
Джуниор
 
Регистрация: 28.08.2015
Сообщений: 4
По умолчанию

Код:
;================================================================
; Вывод строки символов
;Обращение : outstr
;Параметры : нет
;На входе  : ds:dx - адрес начала строки
;            строка должна заканчиваться символом '$', код 36 (24h)
;----------------------------------------------------------------
outstr  macro
        push    ax
        mov     ah,9
        int     21h
        pop     ax
        endm
;================================================================
; Вспомогательный макрос для проверки написания
; имени разными символами большими и малыми
;----------------------------------------------------------------
same    macro   name,variants,ans
        ans=0
        irp     v,<variants>
        ifidn   <name>,<v>
        ans=1
        exitm
        endif
        endm
        endm
;================================================================
; Вспомогательный макрос для вывода чисел
;----------------------------------------------------------------
extrn   procoutnum:far
outnum  macro   num,leng,sign
        local   regdx?
        push    ax
        push    dx
        same    <num>,<dx,DX,dX,Dx>,regdx?
        if      regdx?
        ifb     <leng>
        mov     al,0
        else
        mov     al,leng
        endif
        xchg    ax,dx
        else
        ifb     <leng>
        mov     dl,0
        else
        mov     dl,leng
        endif
        mov     ax,num
        endif
        mov     dh,sign
        call    procoutnum
        pop     dx
        pop     ax
        endm
;================================================================
; Вывод на экран целого со знаком размером в слово
;Обращение : outint num[,leng]
;Параметры : num - выводимое число: i16,r16 или m16
;            leng - необязательная ширина поля для вывода
;            размер i8,r8,m8
;            Если поле больше, чем нужно для вывода числа -
;            слева добавляются пробелы. Иначе выводится только
;            число. По умолчанию leng=0
;----------------------------------------------------------------
outint  macro   num,leng
        outnum  <num>,<leng>,1
        endm
;================================================================
; Вывод на экран целого без знака размером в слово
;Обращение : outword num[,leng]
;Параметры : теже что и в outint
;----------------------------------------------------------------
outword macro   num,leng
        outnum  <num>,<leng>,0
        endm
;****************************************************************
;            ВВОД С КЛАВИАТУРЫ
;****************************************************************
;================================================================
; Очистка буфера ввода с клавиатуры
;Обращение : flush
;Параметры : нет
;----------------------------------------------------------------
extrn   procflush:far
flush   macro
        call    procflush
        endm
;================================================================
; Ввод символа (символы конца строки пропускаются)
;Обращение : inch x
;Параметры : x - вводимый символ r8,m8
;----------------------------------------------------------------
extrn   procinch:far
inch    macro	x
        local   regax?
        same    <x>,<ah,AH,aH,Ah>,regax?
        if regax?
        xchg    ah,al
        mov     al,0
        call    procinch
        xchg    ah,al
        else
        same    <x>,<al,AL,aL,Al>,regax?
        if regax?
        mov     al,0
        call    procinch
        else
        push    ax
        mov     al,0
        call    procinch
        mov     x,al
        pop     ax
        endif
        endif
        endm
;================================================================
; Ввод целого числа размером в слово (со знаком или без)
;Обращение : inint x
;Параметры : x - вводимое число r16,m16
;На выходе : x - введенное число
; При вводе пропускаются все пробелы и концы строк перед числом;
; число начинается с цифры, перед числом возможен знак;
; число со знаком минус вводится как отрицательное;
; ввод числа продолжается до первой не цифры, она глотается;
; при ошибке ввода происходит останов программы и печатается сообщение
; сообщения об ошибках:
;    "нет цифры" - при вводе числа обнаружен символ не являющийся цифрой
;    "переполнение" - число по модулю слишком большое, вне диапазона
;    -32768..+65535
;----------------------------------------------------------------
extrn   procinint:far
inint   macro   x
        local   regax?
        same    <x>,<ax,AX,Ax,aX>,regax?
        if      regax?
        call    procinint
        else
        push    ax
        call    procinint
        mov     x,ax
        pop     ax
        endif
        endm
;================================================================
;
;восстановить вывод в листинг
        .list
Михо94 вне форума Ответить с цитированием
Старый 29.08.2015, 04:13   #5
Михо94
Новичок
Джуниор
 
Регистрация: 28.08.2015
Сообщений: 4
По умолчанию

запускал прогу через run.bat работает норм)
Код:
@echo off
if ""=="%1" goto usage
set path=%path%;C:\ASM\
tasm /zi %1
if errorlevel 1 goto exit
Tasm IOPROC
if errorlevel 1 goto exit
TLINK /v %1 ioproc
if errorlevel 1 goto exit
if "debug"=="%2" goto debug
ECHO ON

%1
pause
goto exit
:debug
td %1
goto exit
:usage
echo usage
echo to compile and run: 	run file_name 
echo to compile and debug:	run file_name debug
echo off
:exit

Последний раз редактировалось Михо94; 29.08.2015 в 04:24.
Михо94 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Assembler - Описать близкую процедуру F(X, N, P), определяющую, сколько элементов массива X из N байтов равно байту P Nisekoi Помощь студентам 0 25.05.2015 21:13
Дано описание X DD ? описать близкую процедуру OUTW16 Thanat Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 04.06.2014 21:21
Описать процедуру Lifehouse Общие вопросы C/C++ 3 05.06.2012 20:13
Описать процедуру в С++ Devil21RUS Помощь студентам 1 17.10.2011 11:54
Описать процедуру sear Паскаль, Turbo Pascal, PascalABC.NET 1 11.05.2011 13:20