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

Локальные переменные в TASM

16.08.2018, 01:52. Показов 2843. Ответов 7

Author24 — интернет-сервис помощи студентам
Доброго времени!

У меня вообще никак не получается сделать локальные переменные в tasm.
Уже всё испробовал, место в стеке не резервирует. Самому резервировать не
хочется.

Вот пример кода в функции:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    PROC    @Func$qusus FAR    
    ARG x:WORD, y:WORD
 
LOCALS
LOCAL @@cY:WORD
 
    push bp
    mov bp, sp
 
    push    ds
        ...
        mov [WORD @@cY],0FFF1h
        ...
    pop ds
 
    pop     bp
    ret
 
    ENDP
Если после PROC добавить C/PASCAL то появляется ENTRE с нулями почему-то
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.08.2018, 01:52
Ответы с готовыми решениями:

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

Локальные переменные
def tozero a=gets.to_i if a>0 a=a-1 p a tozero end end tozero

Локальные переменные
У меня вопрос такой, есть две процедуры, где одна вызывает другую, обе содержат локальные...

Локальные переменные
Подскажите, пожалуйста, как использовать локальные переменные неких методов в других методах?

7
3406 / 1825 / 489
Регистрация: 28.02.2015
Сообщений: 3,696
16.08.2018, 11:04 2
так пробуйте:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
model   small,pascal
.code
begin:  call    myproc,ax,bx
    mov ax,4c00h
    int 21h
myproc  proc    a:word,b:word
local   c:word
;
    mov ax,c
    mov bx,a
    mov cx,b
;
    ret
myproc  endp
.data
.stack
    end begin
листинг получается такой
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
      1 0000                 model   small,pascal
      2 0000                 .code
      3 0000                 begin:  call    myproc,ax,bx
1     4 0000  50                 PUSH    AX
1     5 0001  53                 PUSH    BX
1     6 0002  E8 0005                CALL    MYPROC
      7 0005  B8 4C00                mov     ax,4c00h
      8 0008  CD 21              int     21h
      9 000A                 myproc  proc    a:word,b:word
     10                  local   c:word
     11                  ;
1    12 000A  55                 PUSH    BP
1    13 000B  8B EC              MOV     BP,SP
1    14 000D  83 EC 02               SUB     SP,00002h
1    15 0010  8B 46 FE               mov     ax,c
     16 0013  8B 5E 06               mov     bx,a
     17 0016  8B 4E 04               mov     cx,b
     18                  ;
1    19 0019  8B E5              MOV     SP,BP
1    20 001B  5D                 POP     BP
1    21 001C  C2 0004                RET     00004h
     22 001F                 myproc  endp
     23 001F                 .data
     24 0000                 .stack
     25                      end     begin
и такой код
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
seg000:0000 start           proc near
seg000:0000                 push    ax
seg000:0001                 push    bx
seg000:0002                 call    sub_1000A
seg000:0005                 mov     ax, 4C00h
seg000:0008                 int     21h
seg000:0008 start           endp
seg000:000A sub_1000A       proc near
seg000:000A var_2           = word ptr -2
seg000:000A arg_0           = word ptr  4
seg000:000A arg_2           = word ptr  6
seg000:000A                 push    bp
seg000:000B                 mov     bp, sp
seg000:000D                 sub     sp, 2
seg000:0010                 mov     ax, [bp+var_2]
seg000:0013                 mov     bx, [bp+arg_2]
seg000:0016                 mov     cx, [bp+arg_0]
seg000:0019                 mov     sp, bp
seg000:001B                 pop     bp
seg000:001C                 retn    4
seg000:001C sub_1000A       endp
4
Эксперт CЭксперт С++
5113 / 4552 / 854
Регистрация: 07.10.2015
Сообщений: 9,462
16.08.2018, 11:13 3
yurakir20, чтобы работали локальные переменные, необходимо задавать в модели язык, например C
push bp,mov bp, sp/pop bp добавятся автоматически
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
.model     small, C
 
;...
 
    PROC    @Func$qusus FAR    
    ARG x:WORD, y:WORD
 
LOCALS
LOCAL @@cY:WORD
 
;    push bp
;    mov bp, sp
 
     push    ds
;   ...
     mov [WORD @@cY],0FFF1h
;   ...
    pop ds
 
;    pop     bp
    ret
 
    ENDP
Добавлено через 1 минуту
Constantin Cat, у-у-у... обогнал...
3
3406 / 1825 / 489
Регистрация: 28.02.2015
Сообщений: 3,696
16.08.2018, 11:40 4
Цитата Сообщение от liv Посмотреть сообщение
у-у-у... обогнал..
у меня велосипед быстрее
2
2 / 2 / 1
Регистрация: 01.04.2016
Сообщений: 108
16.08.2018, 12:36  [ТС] 5
Хорошо вроде заработало, но если указать C (MODEL LARGE, C) то ошибка линкера вылазит что не видит
функцию, а вот если у каждой функции прописать в виде PROC @Func$qusus C FAR то работает!

И ещё я увидел что в листинге выше у вас
Assembler
1
2
3
4
5
6
push    bp
mov     bp, sp
sub     sp, 2
...
pop     bp
retn          4
у меня же вместо этого ENTER/LEAVE которые вроде не рекомендуются к использованию.
директивы у меня: IDEAL, JUMPS, LOCALS, SMART, P286N, MODEL LARGE

Добавлено через 16 минут
P.S. забыл написать что вызов осуществляется из Turbo C
прототип в виде:
void far Test(uint16,uint16);
0
Модератор
2121 / 991 / 169
Регистрация: 23.07.2018
Сообщений: 3,328
Записей в блоге: 3
16.08.2018, 13:58 6
Так уж ли важны в наше вреям рекомендации по использованию инструкций в коде, вызываемом из Turbo C?
1
Эксперт CЭксперт С++
5113 / 4552 / 854
Регистрация: 07.10.2015
Сообщений: 9,462
16.08.2018, 14:59 7
yurakir20, тем более, что сами сказали их использовать, указав P286N
1
2 / 2 / 1
Регистрация: 01.04.2016
Сообщений: 108
17.08.2018, 10:43  [ТС] 8
А что насчёт того, почему не работает MODEL LARGE, C
ошибка undefined reference, если указывать у каждой функции отдельно
то работает

Добавлено через 9 часов 55 минут
Всё сам разобрался, оказывается есть разница между указанием MODEL LARGE,C и
указанием в функции языка.
Теперь в прототипе .h функции выглядят в виде:
C++
1
extern "C" void far Func(uint16);
а в ASM файле:
Assembler
1
2
3
4
5
6
7
8
...
MODEL LARGE, C
...
PUBLIC Func
...
PROC Func FAR
...
ENDP
2
17.08.2018, 10:43
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.08.2018, 10:43
Помогаю со студенческими работами здесь

Локальные переменные
Как мне сделать переменную, которая является параметром функции, локальной? короче, наглядный...

Локальные переменные
Есть некоторая функция с локальными переменными. После того как эта функция завершит свою работу,...

Локальные переменные
Какие из указанных форм не «могут» самостоятельно создавать локальные переменные LET DO* PROG...

Локальные переменные
#include <iostream.h> #include <conio.h> // по объявлению библиотек сразу видно компилятор...


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

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