Форум программистов, компьютерный форум, киберфорум
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/8: Рейтинг темы: голосов - 8, средняя оценка - 5.00
86 / 86 / 13
Регистрация: 03.03.2011
Сообщений: 1,873

Первая программа asm

05.09.2014, 10:51. Показов 1779. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Надо написать калькулятор, работающий со стеком. Реакции на нажатия на клаве:
1. Ввели число 0..9, необходимо пометстить его на вершину стека
2. Ввели + или -, необходимо посчитать и вывести результат или вывести ошибку
3. ввели символ "p", необходимо вывести то, что находится на вершине стека или вывести ошибку
4. ввели символ "q", необходимо выйти


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
.model small 
.stack 128 
.data
err db 'error$'
 
.code 
main:
 
mov ah, 01h
int 21h
 
cmp al,57
jg m_pq 
jle m_1
 
 
 
 
 
m_pq:
cmp al,'q'
jmp m_exit
jne m_p
end m_pq
 
m_exit:
mov ax,4c00h
int 21h
end m_exit
 
m_p:
cmp al, 'p'
jmp m_steck_out
jne m_error
end m_p
 
m_error:
mov ax, @data
mov ds,ax
lea dx, err
mov ah, 09h
int 21h
end m_error
 
m_1:
 
end m_1
end main
Подскажите, почему компилятор пишет
undefined symbol : m_1
undefined symbol : m_exit
undefined symbol : m_p
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.09.2014, 10:51
Ответы с готовыми решениями:

Первая программа на gnu asm
Жалко, простаивает раздельчик, а тема то очень интересная. Может кто присоединится? Написала игру пока без использования стека,...

Программа в asm вставке C++
Запнулся на этой задаче: В памяти задан массив из 10-ти элементов. Заменить эти числа произведением их старшего и младшего слова. ...

Первая программа. Код не компилируется и не запускается программа.
Первая программа, первая ошибка Здравствуйте! Решил учить С++. Скачал книгу Programming: Principles and Practice Using C++, Бьерн...

14
2511 / 1132 / 582
Регистрация: 07.06.2014
Сообщений: 3,286
05.09.2014, 13:10
а кто научил после каждой метки писать end Метка ?
Это новое слово в написании ассемблерных программ?!

да и ещё, тасм ругается на идентификатор err, утверждает, что для него это зарезервированное слово...

Добавлено через 1 минуту
а ещё, после команды jmp бессмысленно писать код без метки. Значит на него управление никогда не попадёт!

Добавлено через 1 минуту
Assembler
1
jmp m_steck_out
и где метка m_steck_out ?

Добавлено через 1 час 59 минут
spydark91, расскажите, какую задачу Вы пытаетесь решить с помощью данного кода и давайте попробуем написать вашу программу вместе...
1
86 / 86 / 13
Регистрация: 03.03.2011
Сообщений: 1,873
08.09.2014, 19:53  [ТС]
Сделать надо это
пока что двигаюсь так..
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
.model small 
.stack 128 
.data
erro db 'error$'
 
.code 
main:
 
mov ah, 01h
int 21h
 
 
cmp al,57
jg m_pq ; > 57, проверям на p & q
jle m_1 ; <= 57, проверям на >=48 и + -
 
m_1: 
cmp 48, al
jge m_number ; >= 48, это число
jl n_acts ; < 48, проверка на знаки
 
m_number:
 
n_acts: 
 
 
m_pq:
cmp al,'q'
jne m_p ; al == q
jmp m_exit ; al != q
 
m_p:
cmp al, 'p'
jne m_error
jmp m_steck_out
 
m_steck_out:
 
 
m_error:
mov ax, @data
mov ds,ax
lea dx, erro
mov ah, 09h
int 21h
 
m_exit:
mov ax,4c00h
int 21h
 
 
end main
0
86 / 86 / 13
Регистрация: 03.03.2011
Сообщений: 1,873
08.09.2014, 20:46  [ТС]
и на то, что у меня сейчас есть ругается так
immediate operand not allowed
0
86 / 86 / 13
Регистрация: 03.03.2011
Сообщений: 1,873
09.09.2014, 00:17  [ТС]
не суть в задании

вопрос такой: верно ли делать кучу меток и по ним перемещаться?
и immediate operand not allowed на что ругается компилятор?
0
2511 / 1132 / 582
Регистрация: 07.06.2014
Сообщений: 3,286
09.09.2014, 10:56
spydark91, он ругается на то, что нельзя сравнивать константу с регистром.
(Только наоборот можно) поэтому, вместо
Assembler
1
cmp 48, al
напишите
Assembler
1
cmp al,48
после этого код откомпилируется без ошибок...

p.s. задания вашего я не увидел, поэтому комментировать логику кода, что с чем сравнивается и куда переходит - не берусь...
1
86 / 86 / 13
Регистрация: 03.03.2011
Сообщений: 1,873
09.09.2014, 15:16  [ТС]
правильно ли делать кучу меток и по ним перемещаться?
0
2511 / 1132 / 582
Регистрация: 07.06.2014
Сообщений: 3,286
09.09.2014, 15:27
во, теперь увидел твоё задание. уже хорошо.
Цитата Сообщение от spydark91 Посмотреть сообщение
необходимо пометстить его на вершину стека
не увидел, где у тебя код помещения числа на вершину стека?
Да и стек я бы организовал внутрнений, никак не связанный с программным стеком!

Цитата Сообщение от spydark91 Посмотреть сообщение
правильно ли делать кучу меток и по ним перемещаться?
правильно.
Только не кучу, а минимальное необходимое число.
И важно понимать, что метки в ассемблере - это реализация ветлений и циклов.
пытайся "пройтись" по коду программы по шагам. смотри в каком случае куда может переходить управление.
ты пока поставил метки, но не написал код, который будет по этим меткам.
Когда появится код, тогда можно будет поговорить о том, правильно метки расставлены или нет.
1
86 / 86 / 13
Регистрация: 03.03.2011
Сообщений: 1,873
09.09.2014, 16:04  [ТС]
Цитата Сообщение от Sergio Leone Посмотреть сообщение
не увидел, где у тебя код помещения числа на вершину стека?
его еще и нет)
Цитата Сообщение от Sergio Leone Посмотреть сообщение
Да и стек я бы организовал внутрнений, никак не связанный с программным стеком!
это как?
0
2511 / 1132 / 582
Регистрация: 07.06.2014
Сообщений: 3,286
09.09.2014, 16:17
Цитата Сообщение от spydark91 Посмотреть сообщение
его еще и нет)
я верю, код там будет!

Цитата Сообщение от spydark91 Посмотреть сообщение
это как?
это примерно так:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
model small 
.stack 128 
.data
StackMaxSize = 300
erro db 'error$'
myStack db StackMaxSize Dup (?)
StackPtr dw 0
 
.code 
main:
  mov ax, @data
  mov ds,ax
 
@@m01:
  mov ah, 01h
  int 21h
 
 
  cmp al,57
......
ну и записываем наши числа по смещению, которое хранится в StackPtr, помещения числа в стек - это
а) нарастить на единицу StackPtr
б) записать значение по адресу myStack+StackPtr-1

извлечь из стека:
а) взять в регистр значение по адресу myStack+StackPtr-1
б) уменьшить на единицу StackPtr

ну и постоянно (при записи и при извлечении) следим, чтобы указатель стека не стал больше, чем StackMaxSize и меньше нуля.
кстати, если StackPtr равен нулю - то стек пуст, там ничего нет.
1
86 / 86 / 13
Регистрация: 03.03.2011
Сообщений: 1,873
10.09.2014, 19:21  [ТС]
Цитата Сообщение от Sergio Leone Посмотреть сообщение
Да и стек я бы организовал внутрнений, никак не связанный с программным стеком!
почему лучше делать именно так?
Цитата Сообщение от Sergio Leone Посмотреть сообщение
StackPtr dw 0
почему тут вы использовали dw, а не db

Добавлено через 43 секунды
Цитата Сообщение от spydark91 Посмотреть сообщение
почему тут вы использовали dw, а не db
а, понял
потому что db до 256, а размер стека 300

Добавлено через 33 минуты
еще вопрос
как вывести указатель стека
пробую так, но выводит абра-кадабру
Assembler
1
2
3
4
5
6
7
mov ax, @data
mov ds,ax
 
mov dx, sp
 
mov ah, 09h
int 21h
Добавлено через 29 минут
Assembler
1
2
3
4
5
6
7
mov ax, @stack
mov ds,ax
 
mov dx, sp
 
mov ah, 09h
int 21h
так тоже абракадабра
0
86 / 86 / 13
Регистрация: 03.03.2011
Сообщений: 1,873
10.09.2014, 21:36  [ТС]
процедуру вывода регистра ax предоставил препод

как бы мне очищать регистры ax и dx от мусора и выводить в 10 сс?
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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
.model small 
.stack 128 
.data
erro db 'error$'
;my_stack db 200 Dup (?)
;stack_p db 0
 
.code 
 
ax_out proc uses dx cx
 
.code
push ax
mov ah,02h 
mov cx, 12d 
mainloop:
pop dx 
push dx
shr dx,cl
and dl, 0Fh
cmp dl, 10d
jge add_37h
add dl, 30h
jmp print_4
 
add_37h:
add dl, 37h
 
print_4:
int 21h
sub cx,3 
loop mainloop
 
pop dx
push dx
and dl, 0fh
cmp dl, 10d
jge add_37h_last
add dl, 30h
jmp print_last
 
add_37h_last:
add dl, 37h
 
print_last:
int 21h
pop ax
ret
ax_out endp
 
 
main:
 
mov ah, 01h
int 21h
 
 
cmp al, 57
jg m_pq ; > 57, проверям на p & q
jle m_1 ; <= 57, проверям на >=48 и + -
 
m_1: 
cmp al, 48
jge m_number ; >= 48, это число
jl n_acts ; < 48, проверка на знаки
 
m_number:
push ax ; поместили число в стек
jmp main ; метка main - ждем число
 
n_acts: 
;проверить стек
cmp al, 43
jne m_minus ; al != + 
 
pop dx ; извлек 7
pop ax ; извлек 8
 
 
call ax_out 
 
add ax, dx  
;фигня со стеком
 
 
call ax_out  
 
 
 
jmp main
 
m_minus:
cmp al, 45
jne m_error ; al != -
 
 
jmp main
 
 
m_pq:
cmp al,'q'
jne m_p ; al != q
jmp m_exit ; al == q
 
m_p:
cmp al, 'p'
jne m_error ; al != p
jmp m_stack_out ; a; == p
 
m_stack_out:
xor ax, ax
pop ax
call ax_out
;mov dl, al
;mov ah, 02
;int 21h
jmp main
 
m_error:
mov ax, @data
mov ds,ax
lea dx, erro
mov ah, 09h
int 21h
 
m_exit:
mov ax,4c00h
int 21h
 
 
end main
пояснения к картинке:
сначала ввел 7, потом 8, потом "+", оно посчитало и вывело 026F (все бы ничего, но вот только с мусором и в 16 cc)
потом аналогично с девятками..
Изображения
 
0
2511 / 1132 / 582
Регистрация: 07.06.2014
Сообщений: 3,286
11.09.2014, 15:35
spydark91, не знаю, поможет Вам такой пример вывода числа из регистра ax в десятичном виде или нет, но приведу его. (взял где-то в просторах, где - уже не помню...)

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
90
91
92
.model small 
.stack 128 
.data
  HelloStr db 'Hi! This is program for stack!',10,13,'$'
  erro db 'error$'
 
.code 
 
;;      сохранение регистров в стеке
;;      вход:список имен регистров через запятую в угловых скобках
;;      пример:  push_regs <ax,bx,dx>
push_REGS   macro   regl
        irp     req,<regl>
        push    req
        endm
        endm
 
;;      извлечение из стека значений регистров
;;      вход:   список регистров через запятую в угловых скобках
;;      пример: pop_regs  <dx,bx,ax>
pop_REGS    macro   regl
        irp     req,<regl>
        pop     req
        endm
        endm
 
 
OutAxInt proc near             ;=====Процедура вывода
       push_REGS <ax,bx,cx,dx>
       test ax, ax          ; проверяем число на знак.
       jns oi1                                             
       mov cx, ax            ; eсли оно отрицательное, выведем минус и  
                             ; оставим его модуль
       mov ah, 02h
       mov dl, '-'
       int 21h
       mov ax, cx
       neg ax                                  
oi1:   xor cx, cx            ; количество цифр будем держать в CX
       mov bx, 10            ; основание сс. 10 для десятеричной и т.п.
oi2:   xor dx, dx
       div bx                ; делим число на основание сс, в остатке 
                             ;  получается последняя цифра
       push dx               ; сразу выводить её нельзя, поэтому сохраним 
                             ; её в стэке
       inc cx
                            ; а с частным повторяем то же самое, отделяя
                             ; от него очередную
       test    ax, ax       ; цифру справа, пока не останется ноль, что 
                             ;значит, что дальше
       jnz     oi2           ; слева только нули
 
;========Вывод=========    
        mov ah, 02h
oi3:    pop dx
        add dl, '0'          ; извлекаем очередную цифру, переводим её в 
                             ; символ и выводим
        int 21h
        loop oi3             ; повторим ровно столько раз, сколько цифр 
                             ; насчитали
 
        pop_REGS <dx,cx,bx,ax>
        ret     
OutAxInt endp  
 
 
 
main:
   
   mov ax, @data
   mov ds,ax
   lea dx, HelloStr
   mov ah, 09h
   int 21h
 
 
   mov ax, 7933 ; занесём число для проверки процедуры вывода
 
   call OutAxInt
 
   
   ;--------  ждём нажатия на любую клавишу
   xor ax,ax
   int 16h
 
   ;-------- Выход
   mov ax, 4c00h
   mov al, 0
   int 21h
 
 
   end main
1
Ушел с форума
Автор FAQ
 Аватар для Mikl___
16373 / 7685 / 1080
Регистрация: 11.11.2010
Сообщений: 13,759
11.09.2014, 16:40
Цитата Сообщение от spydark91 Посмотреть сообщение
как бы мне очищать регистры ax и dx от мусора и выводить в 10 сс?
Цитата Сообщение от Sergio Leone Посмотреть сообщение
не знаю, поможет Вам такой пример вывода числа из регистра ax в десятичном виде или нет, но приведу его. (взял где-то в просторах, где - уже не помню...
spydark91, Sergio Leone,
хотя бы, иногда читайте закрепленные темы, например вот это https://www.cyberforum.ru/asse... 54461.html
2
2511 / 1132 / 582
Регистрация: 07.06.2014
Сообщений: 3,286
11.09.2014, 16:46

Не по теме:

Mikl___, спасибо!
Простите... хотел поискать по форуму, но поленился...
Как показывает практика, видимо, я больше писатель, чем читатель. За что и расплачиваюсь порой..



кстати, первая же процедура по ссылке: OutInt - это похоже то же самое, что я привёл в своём пример!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.09.2014, 16:46
Помогаю со студенческими работами здесь

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

Программа для расчета формулы на ASM
Всем привет. очень нуждаюсь в помощи по написанию программы на ASM. программа должна считать по вот такой формуле (a^3-b^3)^2-3ab/4a^2....

Программа не выходит из последнего цикла (Asm + Си)
Здравствуйте, мне надо очень срочно найти ошибку. Программа не выходит из последнего цикла((( mov cx, 10h; mov k, 0; lea...

Первая программа
Здравствуйте! Начинаю изучать С++. Для обучения придумал первую программу. Вот её сценарий: Консольное приложение. Запуск. В окне...

Первая программа
Ток начал работать в RadASM и компилятор у меня masm32. Вот первая прога как в книге Калашникова которая не запустилась(( CSEG...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru