Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
SLiTHER
3 / 3 / 1
Регистрация: 09.08.2010
Сообщений: 125
#1

Что не так в этой программе?

30.05.2013, 09:09. Просмотров 780. Ответов 5
Метки нет (Все метки)

Требуется написать макрокоманду, аналогичную оператору IF в Паскале, для проверки числа в аккумуляторе. Если число отрицательное, то управление передать ячейке NEG, если оно равно 0, управление передать ячейке ZER, если же число положительное, управление передать ячейке POS. И написать программу.

Программу написал, но TASM ругается. Выдает ошибку:

**Error** new.ASM(34) MAKROS(2) Argument to operation or instruction has illegal size
**Error** new.ASM(34) MAKROS(3) Argument to operation or instruction has illegal size
**Error** new.ASM(34) MAKROS(4) Argument to operation or instruction has illegal size

Текст программы следующий:
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
;Макрокоманда передачи управления ячейке памяти
makros macro reg
    cmp reg,0
    je z
    jl n
    jg p
endm
;----------------------------
;Резервирование места под стек
sseg segment stack 'stack'
    dw 256 dup(?)
sseg ends
;----------------------------
;Сегмент данных
data segment
    msgNeg db 10,13,'Negative!','$'
    msgZer db 10,13,'Zero!','$'
    msgPos db 10,13,'Positive!','$'
    n db offset goNeg
    z db offset goZer
    p db offset goPos
data ends
;----------------------------
;Сегмент кода
code segment
    assume cs:code,ds:data,ss:sseg
start:
    mov ax,data      ;настроить сегментный
    mov ds,ax        ;регистр DS на данные
    
    mov al,73h      ;заносим в аккумультор первое пришедшее в голову число
    neg al           ;инвертируем ax, чтобы показать переход с отрицательным числом, т.е. делаем -735 из 735  
    
    makros al        ;макрокоманда, которая проверяет содержимое аккумулятора и передает управление на ячейке памяти
    
goNeg:               ;будет выполняться, если число было отрицательным
    mov ah,09h       ;вывести на экран строку
    lea dx,msgNeg    ;хранящуюся в ячейке памяти
    int 21h          ;msgNeg
    jmp exit
goZer:               ;будет выполняться, если число было равно нулю
    mov ah,09h       ;вывести на экран строку
    lea dx,msgZer    ;хранящуюся в ячейке памяти
    int 21h          ;msgZer
    jmp exit
goPos:               ;будет выполняться, если число было положительным
    mov ah,09h       ;вывести на экран строку
    lea dx,msgPos    ;хранящуюся в ячейке памяти
    int 21h          ;msgPos
    jmp exit
exit:                ;метка выхода из программы
    mov ah,4Ch       
    int 21h
code ends
end start
Что не так? Что ему не нравится в размере операнда? Как правильно передать управление на одну из этих ячеек(n,z,p)?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.05.2013, 09:09
Ответы с готовыми решениями:

Для чего нужны приведенные три строки кода в этой программе
Для чего нужны именно эти 3 строчки в этой программе ? mov ax, cs ...

Что не так(?
я все о своей программе, слепили что-то но почему то не работает подскажите где...

что не так с кодом?
Есть кусок кода: .ELSEIF uMsg==WM_CTLCOLOREDIT invoke...

Что не так в решении?
Задача вместо результата выдает точку. Что делать? Пишу все в TASM Дан массив...

Разъясните что не так
Разъясните что не так title labrab3_8 ;сегмент данных содержащий заданный...

5
Mikl___
Автор FAQ
11730 / 6042 / 543
Регистрация: 11.11.2010
Сообщений: 11,025
30.05.2013, 10:22 #2
SLiTHER, рабочая программа
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
; masm dos exe #
.286     
.model small
.data
    msgNeg db 10,13,'Negative!','$'
    msgZer db 10,13,'Zero!','$'
    msgPos db 10,13,'Positive!','$'
;Макрокоманда передачи управления ячейке памяти
m macro reg
    cmp reg,0
    je goZer
    jl goNeg
    jmp goPos
endm
;----------------------------
.stack 256
.code
start:mov ax,@data      ;настроить сегментный
    mov ds,ax        ;регистр DS на данные
    
    mov al,73h      ;заносим в AL первое пришедшее в голову число
    neg al           ;инвертируем AL, чтобы показать переход с отрицательным числом, т.е. делаем -73 из 73  
    
    m al        ;макрокоманда, которая проверяет содержимое AL и передает управление на ячейке памяти    
goNeg:lea dx,msgNeg  ;будет выполняться, если число было отрицательным
    jmp exit
goZer:lea dx,msgZer  ;будет выполняться, если число было равно нулю
    jmp exit
goPos:lea dx,msgPos    ;будет выполняться, если число было положительным
exit:mov ah,9       ;вывести на экран строку
    int 21h
    mov ah,4Ch       ;выход из программы
    int 21h
end start
0
SLiTHER
3 / 3 / 1
Регистрация: 09.08.2010
Сообщений: 125
30.05.2013, 10:30  [ТС] #3
Mikl___, извините, но это не то. Вы сделали переход на метку, а нужно было сделать переход на ячейку памяти, в которой содержится адрес чего-то другого. Я сам, честно признаться, когда задание прочитал, сделал точно также, как вы. Но потом сказали, что не правильно и заставили переделывать.
0
Mikl___
Автор FAQ
11730 / 6042 / 543
Регистрация: 11.11.2010
Сообщений: 11,025
30.05.2013, 12:08 #4
SLiTHER,
  1. не существует косвенных условных переходов
  2. Assembler
    1
    2
    3
    
    n db offset goNeg
    z db offset goZer
    p db offset goPos
    ячейки n, z, p должны быть размером в слово, чтобы вместить адрес
0
SLiTHER
3 / 3 / 1
Регистрация: 09.08.2010
Сообщений: 125
30.05.2013, 12:36  [ТС] #5
Mikl___, т.е. сослаться на ячейку памяти, в которой содержится смещение следующей желаемой операции, чтобы программа не встала, нельзя в ассемблере? Тогда "либо преподаватель дурак, либо лыжи не катят"

А еще: почему им (n,z,p) нужно быть размером в 2 байта? Программа-то коротенькая. Смещение у этих меток вряд ли даже за 100 выйдет. Байта хватит я думаю.
0
Mikl___
Автор FAQ
11730 / 6042 / 543
Регистрация: 11.11.2010
Сообщений: 11,025
30.05.2013, 12:48 #6
SLiTHER,
  • команды типа jmp [память] есть, но это безусловные переходы, команд типа je/jl/jg [память] нет, есть только команды типа je/jl/jg расстояние_до_метки
  • смещение за предел ста байт и не выйдет, но тебе нужны ячейки для хранения адресов, а это уже два байта
0
30.05.2013, 12:48
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.05.2013, 12:48

задача,что не так?
ATA_SEG SEGMENT A BDW 12 B DW 15 C DW 3 DATA_SEG EDNS CODE_SEG SEGMENT...

что-то не так вычитает
что-то не так тут? почему то записывается в eax и в edx странные вещи...

Что не так с кодом?
В общем само задание выглядит так:Отформатировать текст, длина строки = 40...


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

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

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