Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
halif
3 / 3 / 0
Регистрация: 04.04.2012
Сообщений: 26
1

Реализовать передачу параметров через стек по ссылки в подпрограмму

07.04.2012, 19:39. Просмотров 2317. Ответов 5
Метки нет (Все метки)

Разобрался с сутью задания есть три модуля главный, подпрограмма ввода и вывода чисел в десятичной системе счисления, подпрограмма которая проверяет x>y если да выводит YES если нет выводит NO. Мне нужно передать параметры из главной программы в подпрограмму которая проверяет x и y через регистры по ссылки модуль подпрограммы в нем две ошибки помогите исправить и понять способ передачи вот главная программа


Модуль вывода и ввода чисел полностью исправлен дан для компиляции программы
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
86
87
88
89
public InputInt, OutputInt    ;объявление глобальной процедуры InputInt и           
                                              ;OutputInt                                              
;описание сегмента кода
code segment public 
;указание соответсвующих сегментных регистров сегментам
assume cs:code, ds:data 
 
InputInt proc near                  ;начало подпрограммы InputInt 
 push bx                                 ;заносим в стек адреса возврата или  
 push cx                                 ;содержимое флаговых регистров
 push dx    
 push si   
 
 mov dx,offset strdsc           ;записываем строку в регистр dx
 mov ah,0Ah                        ;чтение строки в буфер (ds:dx адрес буфера)
 int 21h                                 ;21-ое прерывание
 mov dl,0Ah                         ;чтение символа в буфер
 mov ah,2                             ;вывод символа
 int 21h                                 ;21-ое прерывание
 
 xor ax,ax                             ;обнуляем регистр ax (0000)
 xor cx,cx                             ;обнуляем регистр cx (0000)
 mov cl,[strdsc+1]                ;копируем [strdsc+1] в cl
 mov si,offset strbuf             ;записываем строку в регистр si
 mov bx,10                           ;записываем 10 в bx
 
s1: 
mul bx                                   ;умножаем bx на ax
 mov dl,[si]                            ;записываем адрес из регистра si в регистр dl
 inc si                                     ;увеличиваем si
 
sub dl,30h                             ;вычитаем из dl 30h        
 add ax,dx                              ;складываем ax и dx
 loop s1                                  ;s1выполняется до тех пор, пока сх не будет равно     
                                               ;0-лю
 
pop si                                    ;извлекаем адреса возврата или содержимое   
 pop dx                                   ;флаговых регистров из стека
 pop cx 
 pop bx 
 ret                                          ;завершение выполнения программы
InputInt  endp                        ;завершение работы подпрограммы InputInt
 
OutputInt proc near              ;начало работы подпрограммы вывода outputint
 push ax                                ;заносим в стек адреса возврата или 
 push bx                                ;содержимое флаговых регистров
 push cx   
 push dx   
 
 mov bx,10                           ;записываем 10 в bx
 xor cx,cx                             ;обнуляем регистр cx (0000)
 
n1:  xor dx,dx                        ;обнуляем регистр dx (0000)
 div bx                                   ;деление 
 inc cx                                    ;увеличиваем cx
 push dx                                 ;прибавление к cx 01
 or ax,ax                                 ;присваиваем ax значение ax
 jnz n1                                    ;n1 выполняется до тех пор, пока cx не будет  
                                               ;равно 0-лю
 mov bx,offset strbuf             ;сохраняем строку strbuf в bx
n2: pop dx                             ;извлекаем адреса возврата или содержимое
                                              ;регистров памяти из стека
add dl,30h                             ;прибавляем 30h к значению регистра dl
 mov [bx],dl                          ;заносим значение регистра dl в bx
 inc bx                                   ;увеличиваем bx
 loop n2                                 ;n2 выполняется до тех пор, пока сх не будет   
                                              ;равно 0-лю
 
mov byte ptr [bx],'$'           ;присваиваем первому байту адреса, 
                                             ;находящемуся в регистре bx символ $
 
mov dx,offset strbuf           ;заносим строку strbuf в dx
 mov ah,9                             ;9-ая функция Dos: вывод строки
 int 21h                                 ;21-ое прерывание
 
 pop dx                                 ;извлекаем адреса возврата или содержимое 
 pop cx                                 ;флаговых регистров
 pop bx 
 pop ax 
 ret                                        ;завершение выполнения программы
endp OutputInt                     ;завершение работы подпрограммы OutputInt 
code ends                             ;конец сегмента кода программы
 
data segment public 
strdsc db 6,0 
strbuf db 6 dup (?) 
data ends 
 
end
Добавлено через 18 часов 42 минуты

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
extrn InputInt:near ;Оповещение о используемых модулях
                extrn OutputInt:near 
                extrn Find:near 
code segment public
            assume cs:code, ds:data, ss: stek
        start:
        mov ax,data; Настройка DS на начало сегмента
; данных
        mov ds,ax ;адрес переписывается в регистр
        call InputInt ; ввод числа
        mov [X],ax ;сохранение числа в память
        mov dx,offset strend ; перевод курсора на следующую строку
            mov ah,9; запись номера функции вывода строки
        int 21h;прерывание
        call InputInt ; ввод числа
        mov [Y],ax;сохранение числа в память
        mov dx,offset strend ; перевод курсора на следующую строку
        mov ah,9 ; запись номера функции вывода строки
        int 21h ; прерывание
        mov ax,[X];сохранение числа в регистр
        mov bx,[Y]
        call Find;вызов функции
        mov ax,4c00h;запись номера функции завершения 
        int 21h;прерывание
 
            data segment public ;сегмент даных
            X dw 0;выделение памяти под число X
            Y dw 0;выделение памяти под число Y
    strend db 13,10,'$';объявление строки
 str_yes db 'X>Y:YES$';объявление строки 
 
  str_no db 'X>Y:NO$';объявление строки
 
                data ends;конец сегмента данных
                Stek segment stack;сегмент стека
        dw  128 dup (?)
                Stek ends;конец сегмента стека
            end start;конец програмы
вот модуль
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public Find 
code segment public 
assume cs:code 
 
Find proc Near;объявление процедуры
        cmp ax,bx;сравнение чисел
            jb  no_resalt;переход если ax меньше bx
        mov dx,offset str_yes;сохранение адреса строки
            mov ah,9 ; запись номера функции вывода строки
        int 21h;прерывание
        ret;выход из функции
                no_resalt:;метка перехода
        mov dx,offset str_no; сохранение адреса строки
            mov ah,9 ; запись номера функции вывода строки
        int 21h;прерывание
        ret; выход из функции
                Find endp;конец кода функции
                code ends ;конец кода программы
                End
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.04.2012, 19:39
Ответы с готовыми решениями:

Внешняя процедура, выполняющая сложение двух чисел (передача параметров через стек)
Помогите, пожалуйста!!!! Написать прорамму с внешней процедурой, выполняющую...

Передача параметров через стек
Здравствуйте! Подскажите как можно переменную передать через стек в качестве...

Передача параметров через стек
Здравствуйте . Вот есть задача решить уравнение 2*d/3*c - 6*c*d , используя...

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

Передача параметров через стек. Тип процедуры – ближний
Всем привет! Есть задание: Ввести 8-битовое целое число А. Если оно четное,...

5
HITMAN
Absolution
155 / 125 / 3
Регистрация: 22.06.2011
Сообщений: 1,779
07.04.2012, 21:25 2
halif,
Цитата Сообщение от halif Посмотреть сообщение
Мне нужно передать параметры из главной программы в подпрограмму которая проверяет x и y через регистры по ссылки
Т.е. нужно в регистры записать адреса переменных, а в подпрограмме проверить что больше по адресам в регистрах.
0
halif
3 / 3 / 0
Регистрация: 04.04.2012
Сообщений: 26
08.04.2012, 00:39  [ТС] 3
Использую Tasm через Dosbox.
Добавлено через 1 час 20 минут
Все понял, все работает, спасибо за наводящие мысли Но для успокоения души посмотрите коды всех трех модулей, не надо их переделывать а только сообщить если есть лишние строчки которые можно просто удалить то скажите какие. И ГЛАВНОЕ посмотрите действительно я передаю параметры подпрограмме сравнения через регистры по ссылки? Главная программа
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
extrn InputInt:near ;Оповещение о используемых модулях
                 extrn Find:near 
code segment public
            assume cs:code, ds:data, ss: stek
        start:
        mov ax,data; Настройка DS на начало сегмента
; данных
        mov ds,ax ;адрес переписывается в регистр
        call InputInt ; ввод числа
        mov [X],ax ;сохранение числа в память
        mov si,offset x 
    mov dx,offset strend ; перевод курсора на следующую строку
            mov ah,9; запись номера функции вывода строки
        int 21h;прерывание
        call InputInt ; ввод числа
        mov [Y],ax;сохранение числа в память
        mov bx,offset y 
    mov dx,offset strend ; перевод курсора на следующую строку
        mov ah,9 ; запись номера функции вывода строки
        int 21h ; прерывание
        
        call Find;вызов функции
        mov ax,4c00h;запись номера функции завершения 
        int 21h;прерывание
 
            data segment public ;сегмент даных
            X dw 0;выделение памяти под число X
            Y dw 0;выделение памяти под число Y
    strend db 13,10,'$';объявление строки
 str_yes db 'X>Y:YES$';объявление строки 
 
  str_no db 'X>Y:NO$';объявление строки
 
                data ends;конец сегмента данных
                Stek segment stack;сегмент стека
        dw  128 dup (?)
                Stek ends;конец сегмента стека
            end start;конец програмы
Модуль сравнения

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
public Find 
code segment public 
assume ds:data, cs:code 
 
Find proc Near;объявление процедуры
  mov AX,[SI]     
 mov bx, [bx]   
cmp ax,bx;сравнение чисел
            jb  no_resalt;переход если ax меньше bx
        mov dx,offset str_yes;сохранение адреса строки
            mov ah,9 ; запись номера функции вывода строки
        int 21h;прерывание
        ret;выход из функции
                no_resalt:;метка перехода
        mov dx,offset str_no; сохранение адреса строки
            mov ah,9 ; запись номера функции вывода строки
        int 21h;прерывание
        ret; выход из функции
                Find endp;конец кода функции
                code ends ;конец кода программы
                data segment public
    
    str_yes db 'X>Y:YES$';объявление строки 
 
  str_no db 'X>Y:NO$';объявление строки
data ends
 
end
Модуль ввода числа
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
public InputInt
 
code segment public 
assume cs:code, ds:data 
InputInt proc near      ; Подпрограмма ввода числа  
 push bx    ; в десятичной системе счисления  
 push cx    ; в диапазоне 0-65535 с консоли(клавиатуры).  
 push dx    ; На выходе в регистре ax  
 push si    ; находится введенное число. 
  mov dx,offset strdsc     
 mov ah,0Ah     
 int 21h 
 mov dl,0Ah 
 mov ah,2 
 int 21h 
 
 xor ax,ax 
 xor cx,cx 
 mov cl,[strdsc+1] 
  mov si,offset strbuf 
 mov bx,10 
s1: 
mul bx  
 mov dl,[si] 
 inc si 
 sub dl,30h 
 add ax,dx  
 loop s1  
 pop si 
 pop dx 
 pop cx 
 pop bx 
 ret 
InputInt  endp
0
HITMAN
Absolution
155 / 125 / 3
Регистрация: 22.06.2011
Сообщений: 1,779
08.04.2012, 00:49 4
halif, поздравляю. На 100% справился со своим заданием сам. Исходник вполне компактный.
В регистрах передаёшь адреса переменных, всё верно. Позволь полюбопытствую где задают такое?
0
halif
3 / 3 / 0
Регистрация: 04.04.2012
Сообщений: 26
08.04.2012, 00:59  [ТС] 5
отослал в лс
0
HITMAN
Absolution
155 / 125 / 3
Регистрация: 22.06.2011
Сообщений: 1,779
08.04.2012, 01:06 6
halif, зачем тебе подобное этим пусть бакалавры занимаются, а ты Инженер сделай сам опыт кое какой уже есть. Распиши задание поподробнее тоже пошевелю извилинами.
0
08.04.2012, 01:06
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.04.2012, 01:06

Ошибка при передаче параметров в подпрограмму
Ошибки появляются при ассемблинге, их обозначил в коде. Помогите пожалуйста....

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

Как гарантировать передачу единственного параметра через стек?
Как гарантировать передачу единтсвуенного параметра функции в виндузячем x64...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru