powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Причина трёх предупреждений?
25 сообщений из 25, страница 1 из 1
Причина трёх предупреждений?
    #38509471
VlTag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Помогите разобраться!
Для начального изучения Ассемблера набрал исходный код. Ошибок нет. Использую TASM. Получаю работающий файл *.exe. Но почему при ассемблировании выдаются три предупреждения? Хочется добиться ассемблирования без этих предупреждений.
;TASM из пакета tasm5
;Питер Абель Стр.95
;Assembler. DOS. EXE.
;Сложение двух чисел и вывод строки текста
;Стандартное объявление сегментов
;**********************************************
PAGE 60,132
TITLE ASM (EXE)
;**********************************************
STACK SEGMENT PARA STACK 'Stack'
DW 32 DUP(0)
STACK ENDS
;**********************************************
DATASEG SEGMENT PARA 'Data'
Message DB 'Hello world!',13,10,'$'
FLDD DW 3
FLDE DW 4
FLDF DW ?
DATASEG ENDS
;*********************************************
CODESEG SEGMENT PARA 'Code'
MAIN PROC FAR
ASSUME SS:STACK,DS:DATASEG,CS:CODESEG
MOV AX,DATASEG
MOV DS,AX
MOV AX,1
ADD AX,2
MOV BX,AX
MOV AX,FLDD
ADD AX,FLDE
MOV FLDF,AX
MOV DX,OFFSET Message
MOV AH,9H
INT 21H
MOV AL,0
MOV AH,4CH
INT 21H
MOV AX,4C00H
INT 21H
MAIN ENDP
CODESEG ENDS
END MAIN
...
Рейтинг: 0 / 0
Причина трёх предупреждений?
    #38509494
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VlTag,

текстовые предупреждения это круто. Но сейчас в моде телепатическая передача проблем напрямую в мозх.
Как например вот на этом форуме, Вы пытаетесь передать телепатически сообщения предупреждений.
Я их вииииижжжжуууууу!!!! Опссс... Вы ищите клубничку на порно сайте...кхм. это не то... о!!! ввиииииижжжжжуууууу!!!!!
голые бабы какие то :( Прошу сосредоточится! приём затруднён - на линии помехи...попытайтесь ещё раз...


ик
(круглый)
...
Рейтинг: 0 / 0
Причина трёх предупреждений?
    #38509556
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VlTagОшибок нет.Если ты про соответствие набранного текста оригиналу - может быть. Если же про смысл - то вот тут ты неправ, ошибок есть у тебя...
...
Рейтинг: 0 / 0
Причина трёх предупреждений?
    #38509629
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VlTag,

Как уже написали надо увидеть текст предупреждений, иначе сложно сказать почему они могут выскакивать.

Из того, что не очень понятно - это то, что в начале программы выставляется соответствие регистров нужным сегментам, а потом (в первых же строчках выполняемого кода) снова в регистр DS записывается номер сегмента DATASEG. Зачем?

P.S. Скорее всего сообщения появляются на таких инструкциях как MOV AX,FLDD. Компилятор просит явно указать размерность данных, типа MOV AX, word ptr FLDD или как-то так, уже не помню.
...
Рейтинг: 0 / 0
Причина трёх предупреждений?
    #38509687
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Програмёрв начале программы выставляется соответствие регистров нужным сегментам, а потом (в первых же строчках выполняемого кода) снова в регистр DS записывается номер сегмента DATASEG. Зачем?
Сказать, что в DS адрес сегмента - мало, надо ещё сделать так, чтобы он там и правда оказался.

ПрограмёрСкорее всего сообщения появляются на таких инструкциях как MOV AX,FLDD. Компилятор просит явно указать размерность данных, типа MOV AX, word ptr FLDD или как-то так, уже не помню.
Я думаю, всё проще. По умолчанию емнип .8086 - так что эти инструкции просто ниачём.
...
Рейтинг: 0 / 0
Причина трёх предупреждений?
    #38509707
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaПрограмёрв начале программы выставляется соответствие регистров нужным сегментам, а потом (в первых же строчках выполняемого кода) снова в регистр DS записывается номер сегмента DATASEG. Зачем?
Сказать, что в DS адрес сегмента - мало, надо ещё сделать так, чтобы он там и правда оказался.

ПрограмёрСкорее всего сообщения появляются на таких инструкциях как MOV AX,FLDD. Компилятор просит явно указать размерность данных, типа MOV AX, word ptr FLDD или как-то так, уже не помню.
Я думаю, всё проще. По умолчанию емнип .8086 - так что эти инструкции просто ниачём.

Не совсем понял вторую часть ответа. А что в этих инструкциях, чего не может 8086? :)

По поводу первой части, получается, что если у меня в программе 2 data сегмента и я прописываю ASSUME ds:[один из них], то это не гарантирует того, что в момент выполнения кода ds будет указывать именно на тот сегмент, который прописан в ASSUME?
На что тогда данная директива влияет? То есть, что будет, если из приведённого кода её просто убрать?
...
Рейтинг: 0 / 0
Причина трёх предупреждений?
    #38509783
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПрограмёрНе совсем понял вторую часть ответа. А что в этих инструкциях, чего не может 8086?
Пардон, тут я был не совсем внимателен, мне показалось, что там инструкции сопроцессора.
Тем не менее скорее всего именно эти инструкции порождают ворнинги. Но не потому, что компилятор не может выбрать размер операнда (это он как раз может) - он просто не понимает, что от него хотят - поместить в регистр адрес переменной или её содержимое.

ПрограмёрПо поводу первой части, получается, что если у меня в программе 2 data сегмента и я прописываю ASSUME ds:[один из них], то это не гарантирует того, что в момент выполнения кода ds будет указывать именно на тот сегмент, который прописан в ASSUME?
На что тогда данная директива влияет? То есть, что будет, если из приведённого кода её просто убрать?
ИМЕННО! Директива ничего не меняет - она просто указывает, в каком сегменте что ДОЛЖНО находиться. Например, имеется код:

Код: asm
1.
2.
3.
4.
assume ds:dseg, es:dseg
mov ax, word ptr [bx] ; компилится as is
assume ds:xseg, es:dseg
mov ax, word ptr [bx] ; компилится mov ax, es:[bx]
...
Рейтинг: 0 / 0
Причина трёх предупреждений?
    #38509878
VlTag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,
Спасибо специалистам за внимание!
Конечно, не у всех может быть такое древнее ПО как TASM. Поэтому, прошу прощения!
Привожу строки предупреждений (строки с номерами 8, 12, 19):
*Warning* FILE.asm <8> Reserved word used as symbol: STACK
*Warning* FILE.asm <12> Reserved word used as symbol: DATASEG
*Warning* FILE.asm <19> Reserved word used as symbol: CODESEG
...
Рейтинг: 0 / 0
Причина трёх предупреждений?
    #38509889
VlTag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
VlTag,
По номерам строк поправка: <10>, <14>, <21>.
...
Рейтинг: 0 / 0
Причина трёх предупреждений?
    #38509894
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VlTag,

Ну так резервированные слова :) сегменты переназовите и проблема исчезнет ;)
...
Рейтинг: 0 / 0
Причина трёх предупреждений?
    #38510516
VlTag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Програмёр,

Большое спасибо! Не буду более слепо доверять книгам!
Вот исходный код с грамотным использованием резервированных слов.
Предупреждений нет! Всё нормально.

;TASM из пакета tasm5
;Питер Абель Стр.95
;Assembler. DOS. EXE.
;==============================================
PAGE 60, 132
TITLE ASM (EXE)
;----------------------------------------------
stk SEGMENT PARA STACK 'stk'
DW 32 DUP(0)
stk ENDS
;----------------------------------------------
data SEGMENT PARA 'data'
msg DB 'Hello Forum!',13,10,'$'
FLDD DW 3
FLDE DW 4
FLDF DW ?
data ENDS
;----------------------------------------------
ASSUME SS:stk, DS:data, CS:code
;----------------------------------------------
code SEGMENT PARA 'code'
main PROC FAR
MOV AX, data
MOV DS, AX
MOV AX, 1
ADD AX, 2
MOV BX, AX
MOV AX, FLDD
ADD AX, FLDE
MOV FLDF, AX
MOV DX, OFFSET msg
MOV AH, 9H
INT 21H
MOV AL, 0
MOV AH, 4CH
INT 21H
MOV AX,4C00H
INT 21H
main ENDP
code ENDS
END main
...
Рейтинг: 0 / 0
Причина трёх предупреждений?
    #38511185
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VlTag MOV AX, 1
ADD AX, 2
MOV BX, AX


Зачем? MOV BX,3 не короче?
VlTag MOV AX, FLDD
ADD AX, FLDE
MOV FLDF, AX

Аналогично...

P.S.В чем сакральный смысл каких-то вычислений для вывода "Hello world"? Ты ведь даже результат вычислений не выводишь.
...
Рейтинг: 0 / 0
Причина трёх предупреждений?
    #38511348
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ещё любопытнее вот этот фрагмент...
VlTag
Код: powershell
1.
2.
3.
4.
5.
		MOV AL, 0
		MOV AH, 4CH	
		INT 21H
		MOV AX,4C00H
		INT 21H


Последние две команды - тупой балласт без шансов выполниться.
...
Рейтинг: 0 / 0
Причина трёх предупреждений?
    #38513049
VlTag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
1. Для DarkMaster.
Спасибо за внимание!
Это - своеобразные шаги по изучению Ассемблера. Из книги П.Абеля за основу взят вариант работающего кода для вычисления суммы чисел, записанных в переменные FLDD и FLDE (сумма вычисляется через аккумулятор AX). Потом из другого примера взяты фрагменты для вывод строки текста. Главная цель - в одном коде решить сразу несколько задач для обучения:
- добиться правильного ассемблирования и компановки исходного кода;
- посмотреть в отладчике состояние регистров;
- убедиться в работе программы с помощью вывода на экран строки текста.

2. Для Akina.
Также спасибо за внимание!
Это просто для тренировки: попытка записать в региcтр AX числа 4C00H через его младший байт и старший байт. Может быть и неправильно, но ассемблирование проходит без замечаний. Конечно, в чистовых программах так не следует писать код!

3. Всем профессионалам.
Нужны простые программы в качестве примеров! Для быстрого обучения!
Например, нужна простая программа по выводу на экран числа из регистра (пусть числа от 0 до 7).
...
Рейтинг: 0 / 0
Причина трёх предупреждений?
    #38513276
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VlTagНапример, нужна простая программа по выводу на экран числа из регистра (пусть числа от 0 до 7).

Для вывода числа от 0 до 7 достаточно будет преобразовать его в символ, добавив 30h... А дальше - хелп по функциям DOS/BIOS в руки и вперед.
...
Рейтинг: 0 / 0
Причина трёх предупреждений?
    #38513630
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DarkMasterDOS/BIOS
это некрофилия
...
Рейтинг: 0 / 0
Причина трёх предупреждений?
    #38513643
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VlTagЭто просто для тренировки: попытка записать в региcтр AX числа 4C00H через его младший байт и старший байт. Может быть и неправильно, но ассемблирование проходит без замечаний.У меня нет претензий к коду. Есть претензия к одновременности обоих блоков. Просто появляется балласт. Ненужный. Если бы один из вариантов был скажем закомментирован (возможно, с пояснением, что оно однохренственно некомментированному варианту) - претензий бы не было.
...
Рейтинг: 0 / 0
Причина трёх предупреждений?
    #38513729
VlTag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,
Спасибо за любые замечания! Это очень полезно для начинающего программиста.
Прошу покритиковать вот эту программу для вывода числа на экран. Наверное, громоздкая.
Потом сделаю ввод слагаемых с клавиатуры.
А вообще, мне нужно хорошо разобраться с этой древней технологией создания программ для DOS и затем перейти на создание программ для Windows.
;TASM из пакета tasm5
;Вывод на экран числа из регистра
;Assembler. DOS. EXE.
;======================================
PAGE 60, 132
TITLE ASM (EXE)
;--------------------------------------
stk SEGMENT PARA STACK 'stk'
DB 256 DUP (?)
stk ENDS
;--------------------------------------
data SEGMENT PARA 'data'
msg1 DB ' It is a Result. ', 10, 13, '$'
data ENDS
;--------------------------------------
ASSUME SS:stk, DS:data, CS:code
;--------------------------------------
code SEGMENT PARA 'code'
start:
MOV AX, data
MOV DS, AX

MOV BX, 03h
MOV CX, 04h
MOV DX, BX
ADD DX, CX ;Result

MOV AX, DX
push -1
mov cx,10
l: mov dx,0
div cx
push dx
cmp ax,0
jne l
mov ah,2h
l2: pop dx
cmp dx,-1
je ex
add dl,'0'
int 21h
jmp l2
ex: MOV AH, 09h
MOV DX, OFFSET msg1
INT 21h

mov ax,4c00h
int 21h

code ENDS
end start
...
Рейтинг: 0 / 0
Причина трёх предупреждений?
    #38513784
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VlTag,

O_o... Подождите, а показанный код работает?!
Или я чего-то не понимаю, или Вы там стек ломаете (push -1)... Разве нет?

Ну а так, конструкцию сравнения с нулём (cmp reg, 0) стоит заменить на test, а mov reg, 0 на xor reg, reg

(вместо reg разумеется подставить используемый регистр)

но не критично
...
Рейтинг: 0 / 0
Причина трёх предупреждений?
    #38513788
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кстати, вот, что у меня получилось:
Код: plaintext
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.
;----  в регистрах dx:ax лежит наше число, в bx - основание системы, в которой мы хотит вывести число
    mov ax, 0xFFFF
    mov dx, 0x09
    mov bx, 0x0A

    call recurs

    mov eax, 1
    int 0x80

;===================
; вывод числа в указаной системе счисления
; ------------------
; in - dx:ax число. dx обязательно должен быть меньше чем bx
;      bx основание системы, не более 0x0A (10)
; ------------------
; use - ax, dx
;===================
recurs:
  div bx
  test ax, 0xFFFF
  jz no_more_nums
    push dx
    xor dx, dx
    call recurs
    pop dx
  no_more_nums:  
  call write_num
ret

;==========================
; Функция выводит цифру находящуюся в регистре dl
; ------------------------
; in - dl число, которое надо вывести на экран
;==========================
write_num:
    pusha
    add dl, 0x30
    mov [msg], dl
    mov edx, 0x01
    mov ecx, msg
    mov ebx, 1
    mov eax, 4
    int 0x80
    popa
ret


......

msg db '0'



тут в общем как мы обычно привыкли такие задачи решать - рекурсией. )) Меньше условных переходов - и потому немного легче проследить что делается и где.

Кстати, синтаксис немного другой, так как писал на nasm под linux дак ещё и в 64-битном (регистры типа eax, если заметили). Но думаю разобраться будет не сложно.
...
Рейтинг: 0 / 0
Причина трёх предупреждений?
    #38514167
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Програмёр,

а ещё, если в write_num после add dl, 0x30 вставить
Код: plaintext
1.
2.
3.
4.
    cmp dl, 0x39
    jbe not_letter
      add dl, 0x07
    not_letter:



тогда можно число выдавать в системе счисления с основой больше 10 ))
...
Рейтинг: 0 / 0
Причина трёх предупреждений?
    #38514190
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Програмёрконструкцию сравнения с нулём (cmp reg, 0) стоит заменить на testЛучше на OR reg,reg
...
Рейтинг: 0 / 0
Причина трёх предупреждений?
    #38514223
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaПрограмёрконструкцию сравнения с нулём (cmp reg, 0) стоит заменить на testЛучше на OR reg,reg

А почему лучше на OR? Она же, насколько я помню, операнды модифицирует, а сама при этом быстрее не отрабатывается? Есть ещё какая-то особенность, которую стоило бы знать?
...
Рейтинг: 0 / 0
Причина трёх предупреждений?
    #38515421
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПрограмёрА почему лучше на OR?Значение ИЛИ Значение всегда равно Значение.
И равно нулю тогда и только, когда Значение равно нулю.

P.S. Регистровые операции короче операций с непосредственными операндами. И могут оказаться быстрее.
cmp reg, 0 - непосредственный операнд
or reg, reg - регистровая операция.
...
Рейтинг: 0 / 0
Причина трёх предупреждений?
    #38522716
VlTag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем!
Мне был вопрос, работает ли приведённый код
;TASM из пакета tasm5
;Вывод на экран числа из регистра
;Assembler. DOS. EXE.
. . . . . . . . .
Этот код при ассемблировании в трансляторе TASM даёт нормальный файл *.exe. Его надо запускать из командной строки.
Выводится число 7 из регистра DX. Если там будет получено другое число, оно также нормально будет выведено на консоль.
Прошу прощения, но этот код я где-то нашёл (там выводилось число 125). Я вместо 125 получаю в DX число 7.
Вообще всем большое спасибо! Я разберу замечания и рекомендации. Неплохо, если в итоге будет создан компактный работающий код для вывода числа на консоль.
...
Рейтинг: 0 / 0
25 сообщений из 25, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Причина трёх предупреждений?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]