Форум программистов, компьютерный форум, киберфорум
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
7 / 7 / 1
Регистрация: 02.05.2012
Сообщений: 75
1

доработка программы

17.02.2013, 18:48. Показов 478. Ответов 0
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, пишу программу на ассемблере, как мне кажется, делаю все правильно, ассемблирую на старой версии MASM'a, все замечательно, только в отладчике программа работает некорректно. Пробовал версии MASM 5.3 и старше, выдает ошибку "symbol type conflict". Опытные программисты, можете пожалуйста объяснить в чем моя ошибка и что не так в коде?
Задача была такова: Написать подпрограмму для выборки и фиксации местоположения всех элементов, имеющих нечетный паритет, из некоторого массива двойных слов без знака. С помощью этой подпрограммы обработать два массива. Для передачи параметров использовать стек
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
Name Proga
; описание констант
 
; описание  переменных
Data segment
    x1 dd 12345678h,23456789h,98765432h,87654321h     ; входной массив
    max1 label word
    len1 = (offset max1 - offset x1)/type x1
    Y1 dd len1 dup (0)                      ; выходной массив
    F1 dw len1 dup (0)                          ; переменная для фиксации метополжения
    
    X2 dd 12345678h,23456789h,98765432h,87654321h,22345678h,22456789h,98762432h,85654321h  ; входной массив
    max2 label word
    len2 = (offset max2 - offset x2)/type x2
    Y2 dd len2 dup (0)
    F2 dw len2 dup (0)
Data ends
 
Stack SEGMENT
    DW 32 dup(?)
    StkTOp LABEL  word
Stack ends
 
Code SEGMENT
    ASSUME CS: Code, DS: Data, ES: Data, SS: Stack
    
; Здесь описываются подпрограммы
 
Vybor proc  
    push bp
    mov bp, sp
    mov cx, [bp + 4]        ; счетчик. кол-во чисел во входном массиве.
    mov bx, [bp + 6]        ; адрес фиксации местополжения
    mov di, [bp + 8]        ; адрес выходного массива
    mov si, [bp + 10]       ; адрес входного массива
    
M1: mov ax, [si+2]      ; загружаем в регистр АХ старшее слово
    mov dx, [si]            ; загружаем в регистр DX младшее слово
    XOR ax, dx
    XOR al,ah
    JPE M2          ; если четный паритет на М2
    
    mov [di+2], ax      ; производим выборку старшего слова
    mov [di], dx            ; производим выборку младшего слова
    mov [bx], si            ; фиксируем местоположение
    add di, 4           ; модифицируем адрес выборки
    add bx, 2               ; модифицируем адрес местоположения
 
M2:     add si, 4           ; переходим к следующему числу
    dec cx              ; уменьшаем цикл на 1
    JNZ M1          ; если СХ не равен нулю тогда повторяем
    pop bp
ret 8
Vybor endp 
 
; Основная программа
Start:   mov AX, Data
     mov DS, AX
     mov ES, AX
     mov Ax, Stack
     mov SS, AX
     mov SP, StkTop
     
    lea ax, X1              ; передача параметров через стек
    push ax
    lea ax, Y1
    push ax
    lea ax, F1
    push ax
    mov ax, length x1
    push ax
    call Vybor          ; вызываем процедуру                  
    
    lea ax, X2
    push ax
    lea ax, Y2
    push ax
    lea ax, F2
    push ax
    mov ax, length x2
    push ax  
    call Vybor
 
code ends
end start
Добавлено через 3 часа 12 минут
Проблема, как я понял в том, что после обработки первого числа из первого массива, программа переходит не к следующему числу из первого массива, а к первому числу из второго. И после обработки одного числа из второго массива, программа завершается. В чем проблема?
Мне кажется, что ошибка в этом месте:
Assembler
1
2
3
4
 mov cx, [bp + 4]        ; счетчик. кол-во чисел во входном массиве.
    mov bx, [bp + 6]        ; адрес фиксации местоположения
    mov di, [bp + 8]        ; адрес выходного массива
    mov si, [bp + 10]       ; адрес входного массива
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.02.2013, 18:48
Ответы с готовыми решениями:

Мизерная доработка программы
С ассемблером никогда не сталкивался Вобщем есть в программе функция: sprintf_s( ...

Доработка программы
Я написал программу, но она никак не хочет работать. Суть такая. Дана целочисленная прямоугольная...

Доработка программы
Вот дана программа: Uses crt; Var t:text; i,n,a:integer; s:string; begin clrscr; ...

Доработка программы
Осуществляю алгоритм определения, является ли граф двудольным. Как сделать так, чтобы в случае если...

0
17.02.2013, 18:48
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.02.2013, 18:48
Помогаю со студенческими работами здесь

Доработка программы
Добрый день! Прошу, помогите пожалуйста дописать программу. Задание такое: a) Создать...

Доработка программы на С++
Я не могу сообразить, пожалуйстааа помогите(( Есть программа "система учета заявок" Программа...

Доработка программы
Здравствуйте дорогие форумчане. Опишу в краткости свою программу. На нынешнем этапе она состоит в...

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

Доработка программы 3.0
Всем дорого времени суток. Мне нужно было написать программу "в которой по заранее подготовленному...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru