Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
Сидоренко
17 / 43 / 5
Регистрация: 26.10.2010
Сообщений: 447
1

Исправить ошибки в порграмме

18.10.2011, 22:21. Просмотров 605. Ответов 8
Метки нет (Все метки)

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
m segment 
    assume cs:m, ss:m, cs:m, ds:m
    Org 100h; 
st: jmp met; 
    r db ?
    g db 1
    d db 2
    
    met: mov AH,g;
         sar g,4;
         add g,d;
         sub g,3;
         mov BH,1;
         sub BH,8;
         sal g,BH;
         mov r,g;
         
         mov AX,4c00h;
         int 21;
ends
end st

Ошибка в 1-ой и 11 строках. Помогите пожалуйста! Вот еще формула: (R=1-8(g/4+d-3)
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.10.2011, 22:21
Ответы с готовыми решениями:

Окружность: исправить ошибки
при компиляции выдает ошибки: <29>Need address or register <30>Undefined symbol:yc1...

Исправить ошибки в приведенном коде
Привет! Нашел на сайте пример. Вроде все компилится, все ок. Но не работает! Не пишет строчку!...

Исправить ошибки. Вычисление ариф.выражения
Привет, ребята! Выручайте, есть несколько листингов, нужно их подправить, не хотят...

Найти ошибки в куске кода и исправить их
.data byteVal. .db. 1,2,3,4 wordVal. dw ...

Исправить ошибки, и сделать вставку асма
Помогите пожалуйста!!!!не пойму где тут ошибка. Нада исправить и сдеалть вставку асма. Вот условие...

8
zzzyyyxxx
764 / 308 / 11
Регистрация: 27.05.2011
Сообщений: 704
18.10.2011, 22:41 2
1 ... - внимательно глянь, что ты написал
11 - Команда add осуществляет сложение первого и второго операндов. Исходное значение первого операнда (приемника) теряется, замещаясь результатом сложения. Второй операнд не изменяется. В качестве первого операнда команды add можно указывать регистр (кроме сегментного) или ячейку памяти, в качестве второго - регистр (кроме сегментного), ячей-ку памяти или непосредственное значение, однако не допускается опре-делять оба операнда одновременно как ячейки памяти. Операнды могут быть байтами или словами и представлять числа со знаком или без знака. Команду add можно использовать для сложения как обычных целых чи-сел, так и двоично-десятичных (с использованием регистра АХ для хра-нения результата).

16 та же фигня.
1
Сидоренко
17 / 43 / 5
Регистрация: 26.10.2010
Сообщений: 447
18.10.2011, 22:47  [ТС] 3
А что в 1-ом не так? Я просто новичок в ассемблере.
Возможно написать нужно d_ ?? Это кстати com - программа!

Цитата Сообщение от Сидоренко Посмотреть сообщение
add g,d;
Assembler
1
2
add g,d;
mov AX,g
???
0
zzzyyyxxx
764 / 308 / 11
Регистрация: 27.05.2011
Сообщений: 704
18.10.2011, 22:58 4
типа так:
Assembler
1
2
3
4
5
6
7
8
9
10
11
.model tiny
.code
org 100h
start:
            ....
            ;здесь твоё решение
            ....
            ret  ;выход
 
;описать переменные можно здесь
end start
а сложение так:
mov al,g
add al,d ;al - потому, что у тебя переменная байт.
результат в AL (если не догадался)
1
Mischanja
Всегда не хватает времени
118 / 118 / 20
Регистрация: 15.10.2009
Сообщений: 493
18.10.2011, 23:05 5
сделаем так:

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
Data    Segment   para 'data'
g       db      5
d   db  4
r   db  ?
Data    Ends
Code    Segment   para 'code'
            Assume  CS:Code,DS:Data, ES:Nothing
Begin  Proc  Far            
    push DS
    sub AX,AX
        push AX
 
    
    mov BH,g
    mov AL,4
    div BH
    add BH,d
    sub BH,3
 
    mov AL,8
    mul BH
 
    mov CH,1
    sub CH,BH
 
    mov r,CH
 
 
            ret                     
 Begin      Endp                
Code     Ends
            End Begin
1
Сидоренко
17 / 43 / 5
Регистрация: 26.10.2010
Сообщений: 447
18.10.2011, 23:42  [ТС] 6
А что означает push, div, mul ??
Огромное спасибо Вам за то что помогаете. Нам просто толком по Assembler ничего не объяснили, но задали написать эту программу.
0
zzzyyyxxx
764 / 308 / 11
Регистрация: 27.05.2011
Сообщений: 704
18.10.2011, 23:49 7
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
Команда mul выполняет умножение целого числа без знака, находящегося в регистре AL (в случае умножения на байт) или АХ (в случае умножения на слово), на операнд-источник (целое число без знака). Размер произведения в два раза больше размера сомножителей.
Для однобайтовых операций один из сомножителей помещается в регистр AL; после выполнения операции произведение записывается в регистр АХ.
Для двухбайтовых операций один из сомножителей помещается в регистр АХ; после выполнения операции произведение записывается в регистры DX:AX (в DX - старшая часть, в АХ - младшая). Предыдущее содержимое регистра DX затирается.
Если содержимое регистра АН после однобайтового умножения или содержимое регистра DX после двухбайтового умножения не равны 0, флаги CF и OF устанавливаются в 1. В противном случае оба флага сбрасываются в 0.
В качестве операнда-сомножителя команды mul можно указывать регистр (кроме сегментного) или ячейку памяти; не допускается умножение на непосредственное значение. Команда воздействует на флаги OF и CF.
 
 
Пример 1
mov AL,5 ;Первый сомножитель 
mov BL,3 ;Второй сомножитель 
mul BL ;AX=000Fh, произведение
 
Пример 2
mov AX,256 ;Первый сомножитель 
mov BX,256 ;Второй сомножитель 
mul BX ;DX=0001h, AX=0000h
;(DX:AX=65536, произведение)
 
Пример 3
;В полях данных
coef db 100 ;Первый сомножитель
datal db 126 ;Второй сомножитель
mov AL,datal ;AL=7Eh=126
mul coef ;AX=3138h=12600,произведение
 
Пример 4
;B полях данных
coef dw 5000 ;Первый сомножитель 
datal dw 1200 ;Второй сомножитель 
mov AX,datal ;AX=4BOh=1200 
mul coef ;DX=005Bh, AX=8D80h 
;Произведение=ВХ:AX= 
;5B8D80h=6000000
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
Команда div выполняет деление целого числа без знака, находящегося в регистрах АХ (в случае деления на байт) или DX:AX (в случае деления на слово), на операнд-источник (целое число без знака). Размер делимого в два раза больше размеров делителя и остатка.
Для однобайтовых операций делимое помещается в регистр АХ; после выполнения операции частное записывается в регистр AL, остаток - в регистр АН.
Для двухбайтовых операций делимое помещается в регистры DX:AX (в DX - старшая часть, в АХ - младшая); после выполнения операции частное записывается в регистр АХ, остаток - в регистр DX.
В качестве операнда-делителя команды div можно указывать регистр (кроме сегментного) или ячейку памяти; не допускается деление на непосредственное значение. Если делитель равен 0, или если частное не помещается в назначенный регистр, возбуждается прерывание с вектором 0. Команда не воздействует на флаги процессора.
Команду div можно использовать для целочисленного деления неупакованного двоично-десятичного числа в регистре АХ не неупакованный двоично-десятичный делитель, если перед ней выполнить команду aad (см. пример 3).
 
Пример 1 
 
 
mov AX,506 ;Делимое
mov BL,50 ;Делитель
div BL ;AL=0Ah (частное), AH=06h (остаток) 
 
 
Пример 2 
 
 
; В полях данных
long dd 65537 ;Делимое
;В программном сегменте
mov DX,word ptr long+2 ;DX=0001h, старшая
;часть делимого 
mov AX,word ptr long ;AX=0001h, младшая
;часть делимого
mov CX,256 ;Делитель 
div CX ;AX=0100h (частное),
;DX=0001h (остаток) 
 
 
Пример З
 
 
mov AX,0807h ;Неупакованное BCD 87
mov DL,09h ;Неупакованное BCD 9
aad ;AX=0057h=87
div DL ;AX=0609h, т.е. 9 и 6 в остатке

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
Команда push уменьшает на 2 содержимое указателя стека SP и заносит на эту новую вершину двухбайтовый операнд-источник (проталкивает в стек новое данное). Проталкивать в стек можно только целые слова (не байты). Программа должна строго следить за тем, чтобы каждой команде проталкивания в стек push отвечала обратная команда выталкивания из стека pop. Если стек используется для временного хранения некоторых данных, то извлекать эти данные из стека следует в порядке, обратном их сохранению.
В качестве операнда-источника может использоваться любой 16-разрядный регистр (включая сегментный) или ячейка памяти. Не допускается занесение в стек непосредственного значения, хотя некоторые трансляторы преобразуют команду вида
 
push 1234h
 
в неэффективную последовательность операций со стеком, результатом которой будет проталкивание указанного операнда в стек. Команда push не воздействует на флаги процессора.
Пара команд push - pop часто используется для пересылки данного из регистра в регистр (особенно, в сегментный) через стек.
 
Пример 1
 
 
push ES:mem ;Сохранение содержимого 
push DS ;слова памяти mem из 
push BP ;дополнительного сегмента 
;а также регистров DS и ВР;
pop PP ;Восстановление из стека
pop DS ;трех операндов
pop ES: mem ;в обратном порядке
 
Пример 2
 
 
push DS ;Пересылка DS через стек 
pop ES ;Теперь ES=DS
1
Сидоренко
17 / 43 / 5
Регистрация: 26.10.2010
Сообщений: 447
19.10.2011, 01:24  [ТС] 8
Учитывая Ваши замечания, я почитав немного книгу я написал:
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
m segment 
    assume cs:m, ss:m, cs:m, ds:m
    Org 100h; 
st: jmp met; 
    r db ?
    g db 12
    d db 2
    
    met: mov AH,g;
         mov CL,2;
         mov CH,d;
         sar AH,CL;
         add AH,CH;
         sub AH,3;
         mov CL,3;
         sal AH,CL;
         
         mov BH,1;
         sub BH,AH;
         mov r,BH;
         
         mov AX,4c00h;
         int 21;
m ends
end st
Но оно вместо -14, выдает - 15 Почему?? Где лишняя единица?
0
Mischanja
Всегда не хватает времени
118 / 118 / 20
Регистрация: 15.10.2009
Сообщений: 493
19.10.2011, 02:14 9
sar и sal это сдвиги арифметический и циклический, они здесь ни к чему.
используй лучше ту структуру с mul(умножение) и div(деление), если тебе конечно нужно решить (R=1-8(g/4+d-3) это.

кроме того jmp met - безусловный переход на метку met тебе не нужен как ты написал. переход делается когда тебе хочется упустить какую-то часть кода. к примеру тогда когда нужно сделать разветвление по условию.

также знаки - ; - в конце каждой строки не нужны. точка с запятой ставиться тогда, когда тебе нужно прокомментировать строку.
то есть к примеру
Assembler
1
sub AX,BX    ; отнимаем ВХ у АХ
компилятор не учитывает все символы, которые были написаны после знака - ;
1
19.10.2011, 02:14
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.10.2011, 02:14

Как исправить ошибки в программе ассемблера КР580?
Отладчик Asm85. После трансляции в программе показались ошибки,как их исправить? ...

Как исправить ошибки на Assembler. y = (a-(b*b))/100 + 200/a
Здравствуйте. Помогите подредактировать код на ассемблере, и если можно, то с комментариями =) ...

Помогите исправить ошибки
помогите исправить ошибки .model small .data summand_1 db ? N = $ - summand_1...


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

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

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