Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.01.2023, 16:26   #1
alonil
Пользователь
 
Регистрация: 14.01.2023
Сообщений: 38
По умолчанию Помогите,пожалуйста, почему-то код не работает.

В общем в методичке была дана программа.Но дана она была не полностью .Нужно было вставить куски из двух других готовых кодов.Я понимиаю ,конечно,что может прозвучать глупо,но я опытался вставить ,но что-то программа работать не хочет.Нужна помощь.Это программа как пример к решению задания
Решить систему, в зависимости от входящих данных. После получения
результата, применить маскирование с операцией AND и с маской
«0101010101010101» на сам результат. Полученные числа вывести в десятичном
формате через «Enter».
|x/2|+ 𝑦 + 5; 𝑥 < 0; 𝑦 > 10;
2𝑦 + 𝑥 − 4; 𝑥 = 0; 𝑦 = 10;
2x/3− 𝑦 + 8; 𝑥 > 0; 𝑦 < 10
Вот так была дана программа в качестве примера.
Код:
model small ;Объявляем модель программы
data segment ;объявляем начало сегмента данных с помощью ключевого слова "segment"
String db 6 dup(?),'$'
Array db 6 dup(?),'$'
n dw ?
x dw 12
y dw 5
result dw 0
new_line db 10,13, '$'
errorstr db "Введены неверные данные!", 10, 13, '$'
data ends ;конец сегмента данных
stk segment stack ; объявление сегмента стека
db 256 dup(?) ; объем стека
stk ends ; конец стека
code segment ;объявляем начало сегмента кода с помощью ключевого слова "segment"
assume cs: code, ds: data, ss: stk ; assume нужно для того, чтобы связать
сегменты прописанные в коде с сегментами ассемблера *обязательно*
InputInt proc near
 call ClearArray
;процедура из решения Лабораторной Работы №
InputInt endp
ClearArray proc near
push di
mov di, 0
clear:
mov Array[di], 0
inc di
cmp di, 5
jle clear
pop di
ret
ClearArray endp
OutInt proc near
;процедура из решения Лабораторной Работы №
OutInt endp
NewLine proc near
push ax
push bx
push dx
mov ah, 09
lea dx, new_line
int 21h
pop dx
pop bx
pop ax
ret
newLine endp
start:
mov ax, data
mov ds, ax ;кладем в регистр ds ссылку на сегмент данных
xor dx, dx ;очищаем dx
call InputInt ;вызывыаем процедуру ввода числа
mov ax, n ;кладем полученное число, которое хранится в n в переменную x
mov x, ax
call NewLine ;для удобства вызываем процедуру вывода новой строки
call InputInt ;снова вызываем процедуру ввода числа
mov ax, n ;также кладем число в переменную у
mov y, ax
call newLine ;новая строка
mov ax, x
cmp ax, 0 ;для сравнения переменной, кладем в регистр ах и сравниваем с 0
jg xgreater ;если x>0, то переходим в xgreater
je xequal ;если x=0, то переходим в xequal
jl xlower ;если x<0, то переходим в xlower
xlower:
mov bx, y
cmp bx, 10 ;помещаем у в ах и сравниваем с 10
jg ygreater ;если у>10, то переходим в ygreater
jmp terminate ;иначе завершаем программу, т.к. неверны входные данные
ygreater:
mov ax, x ;помещаем в ах х
mov cx, 2 ;в сх - делитель
div cx ;делим, результат остается в ах
add result, ax ;добавляем к итоговой переменной результат
add result, bx ; + у
add result, 5 ; + 5
jmp Output ;переходим на функцию вывода
xequal:
mov bx, y
cmp bx, 10 ;помещаем у в ах и сравниваем с 10
je yequal ;если у=10, то переходим в уequal
jmp terminate ;иначе завершаем программу, т.к. неверны входные данные
yequal:
mov ax, y ;помещаем у в ах
mov cx, 2 ;в сх - множитель
imul cx ;умножаем, результат в ах
mov bx, x ;помещаем х в bx
add result, ax ;добавляем к итоговой переменной результат умножения
add result, bx ; + х
sub result, 4 ; + 4
jmp Output ;переходим на функцию вывода
xgreater:
mov bx, y
cmp bx, 10 ;помещаем у в ах и сравниваем с 10
jl ylower ;если у<10, то переходим в уlower
jmp terminate ;иначе завершаем программу, т.к. неверны входные данные
ylower:
mov ax, x ;помещаем у в ах
mov cx, 2 ;в сх - множитель
imul cx ;умножаем со знаком, результат в ах
mov cx, 3 ;в сх - делитель
idiv cx ;делим со знаком, результат в ах
add result, ax ;добавляем к итоговой переменной результат умножения и
деления
mov bx, y ;перемещаем у в bх
sub result, bx ;отнимает от результата у
add result, 8 ; + 8
jmp Output
Output:
call NewLine ;новая строка
mov ax, result ;в ах - результат
call OutInt ;вызываем функцию вывода
call NewLine ;новая строка
and ax, 0101010101010101B ;маскирование с маской из условия
mov result, ax ;перемещаем результат в переменную
call OutInt ;выводим получившееся число
jmp endOfProgram; завершаем работу программы
terminate:
;вывод строки с сообщением об ошибке
mov ah, 09
lea dx, errorstr
int 21h
endOfProgram:
;завершение программы
mov ah, 4ch
int 21h
code ends
end start
alonil вне форума Ответить с цитированием
Старый 29.01.2023, 16:26   #2
alonil
Пользователь
 
Регистрация: 14.01.2023
Сообщений: 38
По умолчанию

Вот моя попытка добавления недостающих частей.
Код:
.model small ;Объявляем модель программы
data segment ;объявляем начало сегмента данных с помощью ключевого слова "segment"
String db 6 dup(?),'$'
Array db 6 dup(?),'$'
n dw ?
x dw 12
y dw 5
result dw 0
new_line db 10,13, '$'
errorstr db "VVedeni nevernie dannie!", 10, 13, '$'
data ends ;конец сегмента данных
stk segment stack ; объявление сегмента стека
db 256 dup(?) ; объем стека
stk ends ; конец стека
code segment ;объявляем начало сегмента кода с помощью ключевого слова "segment"
assume cs: code, ds: data, ss: stk ; assume нужно для того, чтобы связать
;сегменты прописанные в коде с сегментами ассемблера *обязательно*
InputInt proc near
 call ClearArray
mov ah, 3fh ;вводим число в виде набора символов
mov bx, 0
lea dx, String
int 21h ;регистр ax будет содержать количество введенных символов +2
mov di, ax ;сохраняем количество введенных символов в di
sub di, 3 ;находим позицию последнего символа
mov cx, 1 ;
Convert:
cmp String[di], '-' ;сравниваем первый символ с символом '-'
je TurnsNegative
jmp dal
TurnsNegative: neg n
dal:
mov ax, 0 ;ax обнуляется
mov al, String[di] ;копируем символ, на который показывает di, в al
sub ax, 30h ;преобразуем символ в число (цифру)
mul cx ;умножаем полученное число на cx (данный регистр сейчас используется как
;множитель на 10
add n, ax ;добавляем полученное число в n (результат)
mov bl, 0Ah ;помещаем в bl число 10, чтобы умножить регистр сx на это число
mov ax, cx ;копируем cx в ax для того, чтобы его умножить
mul bl ;умножаем ax на bx
mov cx, ax ;результат сохраняем в cx
dec di ;сдвигаем позицию индекса на один разряд влево
cmp di, 0 ;проверяем, преобразованы ли все символы, кроме первого,
;который может содержать знак числа
jge Convert
InputInt endp
ClearArray proc near
push di
mov di, 0
clear:
mov Array[di], 0
inc di
cmp di, 5
jle clear
pop di
ret
ClearArray endp
OutInt proc near
mov ax, result
;число может быть отрицательным или положительным
push ax ;Ложим ax в стек, чтобы в последствии проверить его знак.
mov si, 10 ;делитель для выделения младшего разряда
;проще говоря, помещаем основание системы счисления
mov di, 5 ;максимально число типа dw может занимать 6 позиций(включая знак).
mov dx, 0 ;dx=0, так как (dx:ax)/si (так как на si мы собираемся делить
cmp ax, 0 ;проверяем знак числа
;если число положительное, переходим на метку NumberToArray
jge NumberToArray
;если число отрицательное, меняем знак
neg ax
NumberToArray:
div si ;значение из (dx:ax) делим на 10, выделяя последний разряд
;числа, который помещается в регистр dx. Так как это число
;не будет больше, чем 9, оно помещается в dl (остаток от деления)
;по сути мы просто выводим остаток от деления на систему счисления
add dl, 30h ;преобразуем полученную цифру в символ (см таблицу ASCII для MSDOS)
mov Array[di], dl ;вставляем полученный символ в строку результата
dec di ;сдвигаем позицию указателя в строке влево
mov dl, 0 ;очищаем dl (где находится остаток от деления)
cmp ax, 0 ;проверяем, преобразованы ли все символы числа
jne NumberToArray ;если преобразованы не все символы, возвращаемся
;на начало цикла
IsNegative:
pop ax ;если всё число преобразовано, извлекаем первоначальное
;значение из стека для проверки знака
cmp ax, 0 ;проверяем знак числа
jge OutputArray ;если число >0, переходим на метку OutputArray (вывод строки)
mov Array[di], '-' ;если число отрицательное, перед числом вставляем знак '-'
OutputArray:
mov ah, 09 ;вывод строки, содержащей преобразованное число
lea dx, Array
int 21h
OutInt endp
NewLine proc near
push ax
push bx
push dx
mov ah, 09
lea dx, new_line
int 21h
pop dx
pop bx
pop ax
ret
newLine endp
start:
mov ax, data
mov ds, ax ;кладем в регистр ds ссылку на сегмент данных
xor dx, dx ;очищаем dx
call InputInt ;вызывыаем процедуру ввода числа
mov ax, n ;кладем полученное число, которое хранится в n в переменную x
mov x, ax
call NewLine ;для удобства вызываем процедуру вывода новой строки
call InputInt ;снова вызываем процедуру ввода числа
mov ax, n ;также кладем число в переменную у
mov y, ax
call newLine ;новая строка
mov ax, x
cmp ax, 0 ;для сравнения переменной, кладем в регистр ах и сравниваем с 0
jg xgreater ;если x>0, то переходим в xgreater
je xequal ;если x=0, то переходим в xequal
jl xlower ;если x<0, то переходим в xlower
xlower:
mov bx, y
cmp bx, 10 ;помещаем у в ах и сравниваем с 10
jg ygreater ;если у>10, то переходим в ygreater
jmp terminate ;иначе завершаем программу, т.к. неверны входные данные
ygreater:
mov ax, x ;помещаем в ах х
mov cx, 2 ;в сх - делитель
div cx ;делим, результат остается в ах
add result, ax ;добавляем к итоговой переменной результат
add result, bx ; + у
add result, 5 ; + 5
jmp Output ;переходим на функцию вывода
xequal:
mov bx, y
cmp bx, 10 ;помещаем у в ах и сравниваем с 10
je yequal ;если у=10, то переходим в уequal
jmp terminate ;иначе завершаем программу, т.к. неверны входные данные
yequal:
mov ax, y ;помещаем у в ах
mov cx, 2 ;в сх - множитель
imul cx ;умножаем, результат в ах
mov bx, x ;помещаем х в bx
add result, ax ;добавляем к итоговой переменной результат умножения
add result, bx ; + х
sub result, 4 ; + 4
jmp Output ;переходим на функцию вывода
xgreater:
mov bx, y
cmp bx, 10 ;помещаем у в ах и сравниваем с 10
jl ylower ;если у<10, то переходим в уlower
jmp terminate ;иначе завершаем программу, т.к. неверны входные данные
ylower:
mov ax, x ;помещаем у в ах
mov cx, 2 ;в сх - множитель
imul cx ;умножаем со знаком, результат в ах
mov cx, 3 ;в сх - делитель
idiv cx ;делим со знаком, результат в ах
add result, ax ;добавляем к итоговой переменной результат умножения и
;деления
mov bx, y ;перемещаем у в bх
sub result, bx ;отнимает от результата у
add result, 8 ; + 8
jmp Output
Output:
call NewLine ;новая строка
mov ax, result ;в ах - результат
call OutInt ;вызываем функцию вывода
call NewLine ;новая строка
and ax, 0101010101010101B ;маскирование с маской из условия
mov result, ax ;перемещаем результат в переменную
call OutInt ;выводим получившееся число
jmp endOfProgram; завершаем работу программы
terminate:
;вывод строки с сообщением об ошибке
mov ah, 09
lea dx, errorstr
int 21h
endOfProgram:
;завершение программы
mov ah, 4ch
int 21h
code ends
end start
alonil вне форума Ответить с цитированием
Старый 29.01.2023, 16:33   #3
alonil
Пользователь
 
Регистрация: 14.01.2023
Сообщений: 38
По умолчанию

Я просто сначала рассматриваю пример.А потом прорешиваю задания подобного типа и закрепля всё.Но вот с работой программы из примера возникли непридвиденые трудности.Видимо где-то в одной из процедур что-то неправильно соединил с кусочком кода из другой лабы.Вот теперь и не пойму что.Можете ,пожалуйста,исправить,то что я там неправильно в итоге сделал.Я бы тогда по рабочему примеру программы смог бы научиться решать задания типичные.
alonil вне форума Ответить с цитированием
Старый 29.01.2023, 16:39   #4
alonil
Пользователь
 
Регистрация: 14.01.2023
Сообщений: 38
По умолчанию

Мне просто нужно ,чтобы этот код работал с добавленными частями.Буду благодарен.Мне просто удобно учить как писать коды к определенным заданиям,когда есть готовый рабочий пример,тогда можно пробовать .глядя на него писать типичные задания и закреплять навык.А так как этот пример пока что не рабочий,то я не могу двигатся дальше ,потому что другие программы написанные по этому примеру тоже работать не будут
alonil вне форума Ответить с цитированием
Старый 30.01.2023, 18:51   #5
alonil
Пользователь
 
Регистрация: 14.01.2023
Сообщений: 38
По умолчанию

Мне уже не нужно.
alonil вне форума Ответить с цитированием
Старый 30.01.2023, 18:51   #6
alonil
Пользователь
 
Регистрация: 14.01.2023
Сообщений: 38
По умолчанию

Я разобрался сам.
alonil вне форума Ответить с цитированием
Старый 11.03.2023, 03:30   #7
Nif-naf
Форумчанин
 
Аватар для Nif-naf
 
Регистрация: 05.09.2016
Сообщений: 131
По умолчанию

Сам тут не разберешся. Если сам тогда код в студию. Для новичка который хочет рабочий асм надо дос и без bx
Немного о GoAsm.
Nif-naf вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Паскаль. Программа по вычислению по формуле не работает, пожалуйста исправьте. Почему? motivator Помощь студентам 3 09.11.2016 08:40
подскажите почему не работает цикл ПОМОГИТЕ mato Общие вопросы C/C++ 2 20.12.2009 15:21
Помогите пожалуйста, программа работает, но почему-то в конце не выводит получившуюся матрицу... Dead Romantic Помощь студентам 6 11.12.2009 19:03
посмотрите пожалуйста программу..почему она не работает? Darya Помощь студентам 9 12.05.2009 17:27