Форум программистов, компьютерный форум, киберфорум
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/18: Рейтинг темы: голосов - 18, средняя оценка - 4.78
0 / 0 / 0
Регистрация: 26.05.2019
Сообщений: 42
TASM

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

04.10.2020, 15:28. Показов 3929. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.

Есть задание посчитать длину окружности. С преподавателем мы разобрались сказали принять пи как 314. Но заданием ещё на лабораторную работу является разделением на внешние программы 3 способами (они описаны будут ниже). В данном форуме я нашёл код сложения, только я его переделал под свою программу так как я не знал как вводить большие числа (Спасибо пользователю ФедосеевПавел). Этот код можно посмотреть здесь - Ввести два любых числа с клавиатуры и вывести их сумму

Так вот, 1 метод осуществлялся через EXTRN и PUBLIC. Я для каждой процедуры сделал свой .ASM файл, и при компиляции .OBJ файлов программа работает. Вот как я подразбил 1 методом:

MAIN.ASM
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
Title   MAIN (EXE)      ; основная программа
Extrn EXT:Far       ; объявление внешней процедуры
Extrn Show_AX:Far
StackSg     Segment PARA STACK 'Stack'
    DW      100H DUP(?)
StackSg     ENDS
 
DataSg  Segment PARA 'Data'
    KeyBuf  db      7, 0, 7 dup(0)      ;max,len,string,CR(0dh)
    CR_LF   db      0Dh, 0Ah, '$'
    Prompt  db      'Enter the number (-32768..+32767): ', '$'
    Result  db      '2*pi*R=', '$'
    Error01 db      'Input error number', 0Dh, 0Ah, '$'
    A       dw      ?
    Y       dw      ?
DataSg  ENDS
 
CodeSg  Segment PARA 'Code'
    Begin       Proc    FAR
        Assume CS:CodeSg, DS:DataSg, SS:StackSg
        mov     ax,     DataSg
        mov     ds,     ax
        
        lea     di,     [A]
        call    EXT
    
        mov     ax,     2
        mov     bx,     314
        mul     bx
        mov     bx,     [A]
        mul     bx
        mov     bx,     100
        div     bx
        mov     [Y],    ax
        lea     dx,     [Result]
        mov     ah,     09h
        int     21h
 
        mov     ax,     [Y]
        Call Show_AX
        
        lea     dx,     [CR_LF]
        mov     ah,     09h
        int     21h
 
        mov     ax,     4C00h
        int     21h
        Ret
    Begin       ENDP
CodeSg  ENDS
END Begin

EXT.ASM

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
Title   EXT ; внешняя подпрограмма
Extrn EXT2:Far
CodeSg  Segment PARA 'Code'
    KeyBuf  db      7, 0, 7 dup(0)      ;max,len,string,CR(0dh)
    CR_LF   db      0Dh, 0Ah, '$'
    Prompt  db      'Enter the number (-32768..+32767): ', '$'
    Result  db      '2*pi*R=', '$'
    Error01 db      'Input error number', 0Dh, 0Ah, '$'
    A       dw      ?
    Y       dw      ?
EXT Proc FAR
Assume CS:CodeSg
Public EXT  ; открытие доступа к подпрограмме
        push    ax
        push    bx
        push    cx
        push    dx
        push    ds
        push    es
        push    si
 
@@Input:
        push    di
        
        lea     dx,     [Prompt]
        mov     ah,     09h
        int     21h
 
        mov     ah,     0Ah
        lea     dx,     [KeyBuf]
        int     21h
 
        lea     dx,     [CR_LF]
        mov     ah,     09h
        int     21h
 
        lea     si,     [KeyBuf+1]
        pop     di
        call    EXT2
 
 
        jnc     @@NoError
 
        lea     dx,     Error01
        mov     ah,     09h
        int     21h
        jmp     @@Input
 
@@NoError:
 
        pop     si
        pop     es
        pop     ds
        pop     dx
        pop     cx
        pop     bx
        pop     ax
        ret
EXT     ENDP
CodeSg  ENDS
END EXT
EXT2.ASM

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
Title   EXT2        ; внешняя подпрограмма
CodeSg  Segment PARA 'Code'
EXT2    Proc FAR
assume CS:CodeSg
Public EXT2 ; открытие доступа к подпрограмме
push    ax
        push    bx
        push    cx
        push    dx
        push    ds
        push    es
        push    si
 
        push    ds
        pop     es
 
        mov     cl, ds:[si]
        xor     ch, ch
 
        inc     si
 
        mov     bx, 10
        xor     ax, ax
 
        cmp     byte ptr [si], '-'
        jne     @@Loop
        inc     si
        dec     cx
@@Loop:
        mul     bx         
        mov     [di], ax   
        cmp     dx, 0      
        jnz     @@Error
 
        mov     al, [si]   
        cmp     al, '0'
        jb      @@Error
        cmp     al, '9'
        ja      @@Error
        sub     al, '0'
        xor     ah, ah
        add     ax, [di]
        jc      @@Error   
        cmp     ax, 8000h
        ja      @@Error
        inc     si
 
        loop    @@Loop
 
        pop     si       
        push    si
        inc     si
        cmp     byte ptr [si], '-'
        jne     @@Check    
        neg     ax        
        jmp     @@StoreRes
@@Check:                   
       or       ax, ax     
       js       @@Error
@@StoreRes:                
        mov     [di], ax
        clc
        pop     si
        pop     es
        pop     ds
        pop     dx
        pop     cx
        pop     bx
        pop     ax
        ret
@@Error:
        xor     ax, ax
        mov     [di], ax
        stc
        pop     si
        pop     es
        pop     ds
        pop     dx
        pop     cx
        pop     bx
        pop     ax
        ret
EXT2    ENDP
CodeSg  ENDS
END EXT2
ShowAx.ASM

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
Title   Show_AX     ; внешняя подпрограмма
CodeSg  Segment PARA 'Code'
Show_AX     Proc FAR
assume CS:CodeSg
Public Show_AX  ; открытие доступа к подпрограмме
    push    ax
        push    bx
        push    cx
        push    dx
        push    di
 
        mov     cx, 10          
        xor     di, di         
 
        or      ax, ax
        jns     @@Conv
        push    ax
        mov     dx, '-'
        mov     ah, 2          
        int     21h
        pop     ax
 
        neg     ax
 
@@Conv:
        xor     dx, dx
        div     cx              
        add     dl, '0'        
        inc     di
        push    dx              
        or      ax, ax
        jnz     @@Conv
@@Show:
        pop     dx              
        mov     ah, 2          
        int     21h
        dec     di              
        jnz     @@Show
 
        pop     di
        pop     dx
        pop     cx
        pop     bx
        pop     ax
        ret
    
Show_AX     ENDP
CodeSg  ENDS
END Show_AX
Но есть ещё два метода

когда директивы PUBLIC используют при описании кодовых сегментов. В этом случае в директиву Segment вносится оператор Public.

CodeSg Segment PARA PUBLIC 'Code'
Т.е как я понимаю нужно в каждом из этих файлов в строке CodeSg добавить Public после PARA? Проблема в том, что при этом методе я скомпилировал файлы, и даже проверил .MAP файл - он сделал кодовый сегмент единым, но сообщение с последующим вводом числа не получится. Я предполагаю что это я намесил в файле EXT.ASM, объявив Data объявление в кодовом сегменте. Но если их удалить, то TASM ругается, что не знает этих объявлений (где они используются). Как здесь поступить?


Есть ещё один метод:
когда присутствуют общие данные для основной программы и подпрограммы. Это предполагает возможность обработки в одном модуле данных, определенных в другом модуле. Пусть области Price и Kol определялись в основной программе, а загрузка значений из этих областей в регистры производились в подпрограмме. Тогда в тексте основной программы кроме объявления внешней подпрограммы (сразу за ним) добавится строка
Public Kol, Price;
команды
Mov AX, Price
Mov BX, Kol
из основной программы перепишутся в подпрограмму (перед командой умножения).
Т.е в основной программе надо в начале объявить все значения переменных в public, которые будут использоваться в других? А как это применить во внешних?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.10.2020, 15:28
Ответы с готовыми решениями:

Разделение программы на 2 модуля
Программа которая сравнивает системное время с введенным. Как ее разделить на 2 модуля? .model tiny .code .386 ORG 100h START:...

Разделение слова на несколько частей
Здравствуйте! Возможно, для знатоков VBA данный вопрос будет выглядеть довольно просто и забавно, но для малоопытного пользователя VBA -...

Разделение проекта на несколько частей
Здравствуйте, вот попал в такую ситуацию, есть Solution, там несколько проектов, среди которых Services и Web -- Services - предоставляет...

2
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8644 / 4479 / 1669
Регистрация: 01.02.2015
Сообщений: 13,883
Записей в блоге: 11
04.10.2020, 18:16
Лучший ответ Сообщение было отмечено Sergey320 как решение

Решение

Третий "метод" относится к данным (к переменным), определённым в одном из модулей. Т.е. это даже не метод, а описание способа доступа к переменным, определённым в другом модуле (файле).
Это как раз относится к тому, что строки приглашения к вводу находятся в основном модуле, а сам ввод осуществляется в модуле "ext.asm". Для доступа к строкам вместо копирования нужно было
- в main объявить их, добавить объявление этих переменных public
- в модуле объявить их EXTRN в сегменте данных

Про способ CodeSg Segment PARA PUBLIC 'Code' ничего не скажу - попробуйте. Мне кажется, что от использования public/extrn никуда не уйти.

Добавлено через 21 минуту
Что-то такое
main.asm
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
;сегмент стека
_stack  segment para    stack   'STACK'
        db      200h dup(?)
_stack  ends
 
;сегмент данных
_data   segment public  'DATA'
        public  my_string
        my_string       db      "my string in 'main.asm'", '$'
_data           ends
;сегмент кода
_text   segment para    public  use16   'TEXT'
 
        extrn   show_string     :near
 
main    proc    far
        mov     ax,     _data
        mov     ds,     ax
 
        assume  cs:_text, ds:_data, ss:_stack
 
        call    show_string
 
        mov     ax,     4C00h
        int     21h
main    endp
 
_text           ends
 
end             main
module_1.asm
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
;сегмент данных
_data   segment public  'DATA'
        extrn   my_string       : byte
_data           ends
;сегмент кода
_text   segment para    public  use16   'TEXT'
 
        assume  cs:_text, ds:_data
 
        public  show_string
show_string     proc    near
        mov     ah,     09h
        lea     dx,     [my_string]
        int     21h
        ret
show_string     endp
 
_text           ends
 
end
командная строка компиляции
Windows Batch file
1
2
3
tasm main.asm
tasm module_1.asm
tlink main.obj+module_1.obj
1
0 / 0 / 0
Регистрация: 26.05.2019
Сообщений: 42
06.10.2020, 19:30  [ТС]
Да всё, спасибо. Теперь разъяснилось. Сейчас сделал программу через объявление Public'ов, всё заработало.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.10.2020, 19:30
Помогаю со студенческими работами здесь

Разделение строки на несколько частей
Доброго времени суток! Нужен совет как быть дальше. Необходимо разделить на части данные следующего вида: "повторно: вн-14-1405/225...

Разделение файла на несколько частей(макрос)
Ребят кто-нить помогите. Я уже отчаялся не знаю как сделать это "Разделить файл на несколько частей с помощью макроса в Excel". Может...

Разделение текстового файла на переменное количество частей и перемещение этих частей
С Вашей помощью у меня получается создать папки с плейлистами @echo off setlocal enabledelayedexpansion >nul chcp 1251 set...

Разделение программы на несколько файлов
Здравствуйте, вот какой возник вопрос, я хотел написанную мною программу в одном файле, разделить на несколько файлов Header.h Sourсе.cpp...

Разделение программы на несколько файлов
Всем доброго времени суток! Возникла проблема - я написал небольшую програмку в main. #include <stdio.h> #include...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru