Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Причина трёх предупреждений? / 25 сообщений из 25, страница 1 из 1
23.12.2013, 01:39
    #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
23.12.2013, 02:47
    #38509494
kolobok0
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Причина трёх предупреждений?
VlTag,

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


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

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

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

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

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

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

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

По поводу первой части, получается, что если у меня в программе 2 data сегмента и я прописываю ASSUME ds:[один из них], то это не гарантирует того, что в момент выполнения кода ds будет указывать именно на тот сегмент, который прописан в ASSUME?
На что тогда данная директива влияет? То есть, что будет, если из приведённого кода её просто убрать?
...
Рейтинг: 0 / 0
23.12.2013, 12:03
    #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
23.12.2013, 13:11
    #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
23.12.2013, 13:17
    #38509889
VlTag
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Причина трёх предупреждений?
VlTag,
По номерам строк поправка: <10>, <14>, <21>.
...
Рейтинг: 0 / 0
23.12.2013, 13:18
    #38509894
Програмёр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Причина трёх предупреждений?
VlTag,

Ну так резервированные слова :) сегменты переназовите и проблема исчезнет ;)
...
Рейтинг: 0 / 0
23.12.2013, 22:36
    #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
24.12.2013, 15:02
    #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
24.12.2013, 17:14
    #38511348
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Причина трёх предупреждений?
Ещё любопытнее вот этот фрагмент...
VlTag
Код: powershell
1.
2.
3.
4.
5.
		MOV AL, 0
		MOV AH, 4CH	
		INT 21H
		MOV AX,4C00H
		INT 21H


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

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

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

Для вывода числа от 0 до 7 достаточно будет преобразовать его в символ, добавив 30h... А дальше - хелп по функциям DOS/BIOS в руки и вперед.
...
Рейтинг: 0 / 0
26.12.2013, 21:45
    #38513630
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Причина трёх предупреждений?
DarkMasterDOS/BIOS
это некрофилия
...
Рейтинг: 0 / 0
26.12.2013, 22:14
    #38513643
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Причина трёх предупреждений?
VlTagЭто просто для тренировки: попытка записать в региcтр AX числа 4C00H через его младший байт и старший байт. Может быть и неправильно, но ассемблирование проходит без замечаний.У меня нет претензий к коду. Есть претензия к одновременности обоих блоков. Просто появляется балласт. Ненужный. Если бы один из вариантов был скажем закомментирован (возможно, с пояснением, что оно однохренственно некомментированному варианту) - претензий бы не было.
...
Рейтинг: 0 / 0
27.12.2013, 01:02
    #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
27.12.2013, 03:05
    #38513784
Програмёр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Причина трёх предупреждений?
VlTag,

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

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

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

но не критично
...
Рейтинг: 0 / 0
27.12.2013, 03:28
    #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
27.12.2013, 13:14
    #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
27.12.2013, 13:27
    #38514190
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Причина трёх предупреждений?
Програмёрконструкцию сравнения с нулём (cmp reg, 0) стоит заменить на testЛучше на OR reg,reg
...
Рейтинг: 0 / 0
27.12.2013, 13:54
    #38514223
Програмёр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Причина трёх предупреждений?
AkinaПрограмёрконструкцию сравнения с нулём (cmp reg, 0) стоит заменить на testЛучше на OR reg,reg

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

P.S. Регистровые операции короче операций с непосредственными операндами. И могут оказаться быстрее.
cmp reg, 0 - непосредственный операнд
or reg, reg - регистровая операция.
...
Рейтинг: 0 / 0
11.01.2014, 01:13
    #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]