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

Параметры макрокоманды. Несоответствие типов при выполнении команды mov

04.11.2011, 17:12. Показов 1697. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!прошу помочь решить одну проблему. у меня есть макрокоманда:
perevod macro z
1 and al,0fh
2 shl al,4
3 mov ah,z
4 add ah,al
5 mov z,ah
в строке 3 и 5 выдаёт ошибку о несоответствии типов.
Вызов этой макрокоманды осущ-ся из другой макрокоманды. соответственно я из главной программы в качестве параметра передаю имя переменной объявленной в сегменте .data в первую макрокоманду, а затем этот параметр первой макрокоманды передаю уже в приведённую макрокоманду. переменная имеет тип db. как исправить???
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.11.2011, 17:12
Ответы с готовыми решениями:

Не работает макрос при условии выполнении макрокоманды равно 0
Данный макрос должен отображать просроченные договора по двум условиям: 1. Если ДатаОкончанияДоговора < текущей даты. И, в связке ...

Несоответствие типов при вводе данных
День добрый, возникла проблема. Хотел поставить условие, на рамки входных данных, но не смог, потому что компилятор ругается на...

Несоответствие типов данных при работе с БД
Пишет несоответствие типов данных, не пойму почему Public Class add_donor Dim Con As New...

11
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33395 / 21505 / 8236
Регистрация: 22.10.2011
Сообщений: 36,902
Записей в блоге: 12
04.11.2011, 17:29
Создай LST-файл (опция /l для TASM-а) и посмотри, во что разворачиваются твои макросы.
0
Заблокирован
04.11.2011, 17:37  [ТС]
ну я просмотрела.в принципе он заменяет всё правильно.
perevod b
2 214 00D7 24 0F and al,0fh
2 215 00D9 D0 E0 D0 E0 D0 E0 D0+ shl al,4
216 E0
2 217 00E1 8B 26 0056r mov ah,b
**Error** lab3.ASM(100) PEREVOD(3) Operand types do not match
2 218 00E5 02 E0 add ah,al
2 219 00E7 89 26 0056r mov b,ah
**Error** lab3.ASM(100) PEREVOD(5) Operand types do not match
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33395 / 21505 / 8236
Регистрация: 22.10.2011
Сообщений: 36,902
Записей в блоге: 12
04.11.2011, 17:43
Можешь показать оба макроса, описание переменной и вызов первого макроса? А лучше - программу полностью, чтоб было понятно что к чему...
0
Заблокирован
04.11.2011, 18: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
masm
model small
.data
    string1 db "Vvedite chislo$"
    string2 db "(odnobaitovoe)a= $"
    string3 db "(dvubaitovoe)b= $"
    string4 db "(dvubaitovoe)c= $"
    string5 db "(odnobaitovoe)d= $"
    a db 0
    b dw 0
    c dw 0
    d db 0
.code
perevod macro z
          and al,0fh
          shl al,4
          mov ah,z
          add ah,al
          mov z,ah
endm
vvod macro b,x
    local m1,m2,m3,m4,m5,m6,m7,m8,m9,m10
    xor bx,bx           
m1: xor cl,cl
    mov ah,10h
    int 16h
    cmp al,13
    je m8
    cmp al,30h
    mov cl,30h
    jnl m2
    jl m1 
m2: cmp al,39h
    mov cl,30h
    jng m9
    jg m3 
m3: cmp al,41h
    mov cl,37h
    jnl m4
    ;jl m1 
m4: cmp al,46h
    mov cl,37h
    jng m9
    jg m5 
m5: cmp al,61h 
    mov cl,37h  
    jnl m6
    ;jl m1 
m6: cmp al,66h
    mov cl,37h
    jng m9
    jg m1   
m9: push ax
    perevod x
    pop ax  
    mov dl,al
    mov ah,02h
    int 21h     
    jmp m7 
m7:   inc bx        ;перевод курсора на новую строку
    cmp bx,bb
    jne m1
    je m8
    mov dl, 10    
    mov ah, 02h
    int 21h
            mov dl, 13    
    mov ah, 02h
    int 21h
m8: 
endm
 
vivodstr macro z
    mov dx, offset z
    mov ah, 09h
    int 21h
endm
 
probel macro
    mov dl, 10    
    mov ah, 02h
    int 21h
            mov dl, 13    
    mov ah, 02h
    int 21h
endm
 
prog:
    mov ax, @data
    mov ds, ax        
          
          vivodstr string1
          probel
 
    vivodstr string2
    vvod 2,a
    probel
    
    vivodstr string3
    vvod 4,b
    probel
    
    vivodstr string4
    vvod 4,c
    probel
    
    vivodstr string5
    vvod 2,d
    probel
    
    mov ah, 10h     ;ожидание нажатия клавиши
    int 16h
    
    mov ax, 4c00h ;завершение работы программы
    int 21h
end prog
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33395 / 21505 / 8236
Регистрация: 22.10.2011
Сообщений: 36,902
Записей в блоге: 12
04.11.2011, 18:22
Цитата Сообщение от Alenka=) Посмотреть сообщение
Assembler
1
2
3
4
a db 0
b dw 0
c dw 0
d db 0
А говорила, что
Цитата Сообщение от Alenka=) Посмотреть сообщение
переменная имеет тип db.
Где ж DB, когда половина переменных имеет один тип, половина - другой, а передаются в один и тот же макрос?

Да, и еще:

Цитата Сообщение от Alenka=) Посмотреть сообщение
Assembler
1
2
3
m7: inc bx ;перевод курсора на новую строку
cmp bx,bb  ; <--- Вот это что за BB? Откуда взялось? Компилятор не знает об этом ничего...
jne m1
0
Заблокирован
04.11.2011, 18:35  [ТС]
bb - это параметр для того чтобы ограничить число вводимых цифр.
вот.исправила.
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
masm
model small
.data
    string1 db "Vvedite chislo$"
    string2 db "(odnobaitovoe)a= $"
    string3 db "(dvubaitovoe)b= $"
    string4 db "(dvubaitovoe)c= $"
    string5 db "(odnobaitovoe)d= $"
    a db 0
    b dw 0
    c dw 0
    d db 0
.code
perevod macro z
          and al,0fh
          shl al,4
          mov ah,z
          add ah,al
          mov z,ah
endm
vvod macro bb,x
    local m1,m2,m3,m4,m5,m6,m7,m8,m9,m10
    xor bx,bx           
m1: xor cl,cl
    mov ah,10h
    int 16h
    cmp al,13
    je m8
    cmp al,30h
    mov cl,30h
    jnl m2
    jl m1 
m2: cmp al,39h
    mov cl,30h
    jng m9
    jg m3 
m3: cmp al,41h
    mov cl,37h
    jnl m4
    ;jl m1 
m4: cmp al,46h
    mov cl,37h
    jng m9
    jg m5 
m5: cmp al,61h 
    mov cl,37h  
    jnl m6
    ;jl m1 
m6: cmp al,66h
    mov cl,37h
    jng m9
    jg m1   
m9: push ax
    perevod x
    pop ax  
    mov dl,al
    mov ah,02h
    int 21h     
    jmp m7 
m7:   inc bx        ;перевод курсора на новую строку
    cmp bx,bb
    jne m1
    je m8
    mov dl, 10    
    mov ah, 02h
    int 21h
            mov dl, 13    
    mov ah, 02h
    int 21h
m8: 
endm
 
vivodstr macro z
    mov dx, offset z
    mov ah, 09h
    int 21h
endm
 
probel macro
    mov dl, 10    
    mov ah, 02h
    int 21h
            mov dl, 13    
    mov ah, 02h
    int 21h
endm
 
prog:
    mov ax, @data
    mov ds, ax        
          
          vivodstr string1
          probel
 
    vivodstr string2
    vvod 2,a
    probel
    
    vivodstr string3
    vvod 4,b
    probel
    
    vivodstr string4
    vvod 4,c
    probel
    
    vivodstr string5
    vvod 2,d
    probel
    
    mov ah, 10h     ;ожидание нажатия клавиши
    int 16h
    
    mov ax, 4c00h ;завершение работы программы
    int 21h
end prog
получается для каждого типа нужно создать отдельную макрокоманду?
0
Заблокирован
07.11.2011, 16:40  [ТС]
помогите пожалуйста!может я не правильно расцениваю команду size? но вот этот код не срабатывает, в качестве параметра z передаются переменные двух разных типов db и dw
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
perevod macro z
local m1,m2,m3  
    and al,0fh
          shl al,4
          mov bl,size z
          cmp bl,1
          je m1
          jne m2
m1:   mov bh,z
    add bh,al
    mov z,bh
    jmp m3       
m2:   mov bx,z
          add bx,ax
          mov z,bx
m3:           
endm
в 7ой, 9, 11 и 13 строках - несоответствие типов.в чём ошибка?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33395 / 21505 / 8236
Регистрация: 22.10.2011
Сообщений: 36,902
Записей в блоге: 12
07.11.2011, 17:35
Этот код не будет даже компилироваться:
mov bh,z при Z типа DW вызовет ошибку. Равно как и mov z,bx - если Z будет байтом...

Добавлено через 18 минут
А вот так - будет:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
perevod macro z  
    and al, 0fh
    shl al, 4
    ; Если размер Z = 1, то будет обработана одна последовательности команд
    IF size z EQ 1
        mov bh,z
        add bh,al
        mov z,bh
    ; , а если размер Z = 2 - то другая последовательность
    ELSEIF size z EQ 2
        mov bx,z
        add bx,ax
        mov z,bx
    ENDIF
endm
Теперь смотрим LST-файл: сначала perevod a, размер = 1 байт
1 164 perevod a
2 165 0058 24 0F and al, 0fh
2 166 005A D0 E0 D0 E0 D0 E0 D0+ shl al, 4
167 E0
2 168 0062 8A 3E 0055r mov bh,a
2 169 0066 02 F8 add bh,al
2 170 0068 88 3E 0055r mov a,bh
1 171 006C 58 pop ax
потом - perevod b, размер = 2 байта:
1 229 perevod b
2 230 00D6 24 0F and al, 0fh
2 231 00D8 D0 E0 D0 E0 D0 E0 D0+ shl al, 4
232 E0
2 233 00E0 8B 1E 0056r mov bx,b
2 234 00E4 03 D8 add bx,ax
2 235 00E6 89 1E 0056r mov b,bx
1 236 00EA 58 pop ax
Как видишь, коды разные...
1
Заблокирован
07.11.2011, 17:48  [ТС]
А почему не сработает команда cmp bl,1 (в bl содержится кол-во байт для переменной z)так же как в вашем коде условный оператор?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33395 / 21505 / 8236
Регистрация: 22.10.2011
Сообщений: 36,902
Записей в блоге: 12
07.11.2011, 17:59
Нет, не так же. В моем случае в код вставляются разные участки в зависимости от условия, и потом они компилируются (то есть, несовпадающих по размеру регистра/переменной в результирующем коде просто нет), в твоем же случае весь макрос вставляется полностью, и результирующий код содержит и команду mov z, bh, и команду mov z, bx, компиляция одной из них (в зависимости от размера передаваемой переменной) уже приведет к ошибке.
1
Заблокирован
07.11.2011, 18:35  [ТС]
UI, спасибо большое!вы очень мне помогли!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.11.2011, 18:35
Помогаю со студенческими работами здесь

Несоответствие типов real при компиляции
Добрый день. Возник такой вопрос с несоответствием типов в delphi 7. Проблема возникла при компиляции программы. Половина программы...

Несоответствие типов при проверке даты
Здравствуйте! Помогите,пожалуйста. Программа ругается на типы, использовала функцию cint, но ошибку неудалось убрать. Private Sub...

Ошибка при сравнении диапазонов - несоответствие типов
Здравствуйте, проблема в следующем: пытаюсь сравнить два диапазона на Листе1 &quot;Общий&quot; диапазон B4:B6 и Листе18...

Ошибка 26: несоответствие типов при работе с файлами
(программа сделана не до конца, ещё работаю) не могу понять почему пишет ошибку 26 несоответсвие типа program Slovarb_rus_eng; ...

Несоответствие типов при обращении к элементам матрицы
Программа правильно работала с типом Int, но в лабе нужно дробные числа использовать в матрицах переделал прогу под float и теперь выдает...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера 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. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru