Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Assembler

Автор: jaKrevedko
Дата сообщения: 08.02.2011 21:26
Всем добрый вечер,есть парочка вопросов,начал изучать ассемблер.. и вот собственно первая лабораторная на нём , простенькая формула ,подобные которой я за 10 минут осваивал на Делфях и плюсах когда начинал их изучать. формула M = 16(n(n + 1)(2n + 1))
На ассемблере она же испортила мне добрую половину мозга.Какой компилятор и линкер использовать лучше всего под Windows 7 x64 , старенький тасм который раздали в институте на ней даже не запустился , масм не хочет ничего компилировать ругается на какие то ошибки описания которых я не смог нагуглить.И если можно , проверьте сам текст программы на ошибки.


Код: Data1     Segment
M     Dw ?
N     Dw 5 ;любое число
X     DW 16
One     Dw 1
Two     Dw 2
Data     Ends
Code1     Segment
     Assume CS: Code, DS:Data1
Start: Mov    Ax,Data1
     Mov    Ds,Ax
Mov Es,Ax
     Mov    Ax,Two            ;Ax =2
Idiv One
     Imul    N             ;AX=AX*N
     Mov    AX,BX             ;AX помещаем в BX (2*n)
     Add    AX,One            ;AX+1 (2n+1)
     Mov    AX,BX             ;AX помещаем в BX (2n+1)
     Mov    AX,N            ;N помещаем в AX
     Add    AX,1             ;AX+1
     Mov    AX,CX             ;AX помещаем в CX (N+1)
     Mov    AX,N             ;N помещаем в AX
     Imul    BX             ;AX умножаем на BX (n*(n+1))
     Imul    CX             ;AX умножаем на CX (n*(n+1))*(2n+1)
     Mov    AX,BX             ;BX= n*(n+1))*(2n+1)
     Mov    AX,16             ;AX=16
     Imul    BX
     Mov    AX,M             ;M=16*((n*(n+1)*(2n+1))
     Mov    AL,0
     Mov    AH,4CH
     Int    21H
Code1     Ends
     end    Start
Автор: bomzzz
Дата сообщения: 08.02.2011 22:15
не надо было 64 битную систему ставить. ищи специальный 64 битный компилятор. микрософт ассемблер официально больше не поддерживает. соответсвенно у тебя будет соверешенновсе по другому и форум ищи 64 битный

Добавлено:
http://www.fileguru.com/apps/tasm_for_windows7_64_bit

Добавлено:
можешь виртуалку поставить на ней дос запустить и откмпилировать. только как ты отлаживать будешь
Автор: ValidolX
Дата сообщения: 08.02.2011 22:29

Цитата:
микрософт ассемблер официально больше не поддерживает


не надо пугать народ

http://msdn.microsoft.com/en-us/library/afzk3475.aspx
Автор: bomzzz
Дата сообщения: 08.02.2011 22:30
ставь студию.

Добавлено:
http://www.masm32.com/index.htm а 32 битный есть нормальный, любительский

Добавлено:

Цитата:

Версии MASM

Хотя MASM больше не является коммерческим продуктом, Microsoft продолжает поддерживать исходный код, используемый и в других продуктах Microsoft. С тех пор как Microsoft прекратила продавать MASM отдельно, было выпущено несколько обновлений к производственной линии MASM 6.x (последнее обновление — версия 6.15, которая была включена в Visual C++ 6.0), а после этого — MASM 7.0 в составе Visual C++ .NET 2002, MASM 7.1 в составе Visual C++ .NET 2003, MASM 8.0 в составе Visual C++ 2005 и MASM 9.0 в составе Visual C++ 2008, поддерживающие платформу x64.
Автор: jaKrevedko
Дата сообщения: 09.02.2011 18:02
bomzzz
Оужас , 8 гигов ,32 битная система и Adobe Premiere несовместимы ,не мне такое не подходит , попробую чо нибудь другое . кстати 64 битный тасм создаёт obj файл но не линкует , ещё один геморрой чем линковать?уже нашел .Всем спасибо за внимание и объяснение
Автор: bomzzz
Дата сообщения: 09.02.2011 20:47
тасм всяко лучше что микрофостовский, тасм развивается. а отладчик на 64 бита есть?
Автор: ValidolX
Дата сообщения: 10.02.2011 10:09

Цитата:
тасм всяко лучше что микрофостовский

обоснуйте пож-та


Цитата:
а отладчик на 64 бита есть?

WinDbg
Автор: bomzzz
Дата сообщения: 10.02.2011 19:01
потому что на тасм вся документация есть. а у микрософта все есть на С. и вообще если все начнут на ассемблере программы писать, тогда программы будут получаться маленькие и быстродейственные, так что микрософтовские подельники производители железа остануться без спроса на свою продукцию

Добавлено:
поищите может и есть все на масм64. мне не попадалось. на масм32 есть все
Автор: Benchmark
Дата сообщения: 11.02.2011 00:51
jaKrevedko

Цитата:
Какой компилятор и линкер использовать лучше всего под Windows 7 x64

Под 64-бит Windows не работают старые DOS и Win16 приложения. Поэтому сгодится любой компилятор, позволяющий создавать exe'шники под Win32 или Win64. Какой именно - дело вкуса и привычки. От себя могу порекомендовать FASM (http://flatassembler.net)

Вот максимально упрощенный пример вычисления формулы M = 16(n(n + 1)(2n + 1)). Запустить FASMW.exe, скопировать туда код, нажать F9 для компиляции

;========================= Win32 console приложение ===========================;
format PE CONSOLE 4.0
entry start
include 'win32a.inc'

;================================ Code section ================================;
section '.code' code readable executable

start:
movzx eax, [N] ; eax = N
mov ebx, eax ; ebx = N
shl eax, 1 ; eax = 2N
inc eax ; eax = 2N + 1
imul ebx ; eax = N(2N + 1)
inc ebx ; ebx = N + 1
imul ebx ; eax = N(2N + 1)(N + 1)
shl eax, 4 ; eax = 16*N(2N + 1)(N + 1) - результат

invoke ExitProcess, 0

;================================ Data section ================================;
section '.data' data readable writable

N db 255 ; любое число от 0 до 255

;=============================== Import section ===============================;
section '.idata' import data readable writable

library kernel32, 'kernel32.dll'

import kernel32,\
ExitProcess, 'ExitProcess'
Автор: bomzzz
Дата сообщения: 11.02.2011 01:30
теперь понятно почему вопросы где взять компилятор для 64 всегда кончается ничем, юзают 32
Автор: Benchmark
Дата сообщения: 11.02.2011 02:14
bomzzz
Вот тот же самый пример, который скомпилируется в 64-битный exe'шник

;========================= Win32 console приложение ===========================;
format PE64 CONSOLE 5.0
entry start
include 'win64a.inc'

;================================ Code section ================================;
section '.code' code readable executable

start:
sub rsp, 8 ; выровнять стек по 8-байт границе

movzx rax, [N] ; rax = N
mov rbx, rax ; rbx = N
shl rax, 1 ; rax = 2N
inc rax ; rax = 2N + 1
imul rbx ; rax = N(2N + 1)
inc rbx ; rbx = N + 1
imul rbx ; rax = N(2N + 1)(N + 1)
shl rax, 4 ; rax = 16*N(2N + 1)(N + 1) - результат

invoke ExitProcess, 0

;================================ Data section ================================;
section '.data' data readable writable

N dw 65535 ; любое число от 0 до 65535

;=============================== Import section ===============================;
section '.idata' import data readable writable

library kernel32, 'kernel32.dll'

import kernel32,\
ExitProcess, 'ExitProcess'
Автор: bomzzz
Дата сообщения: 11.02.2011 06:00
да мине зачем, я не поклонник ни 64 бит ни фасма
Автор: Benchmark
Дата сообщения: 11.02.2011 16:04
bomzzz

Да я про то, что

Цитата:
вопросы где взять компилятор для 64

... неактуальны. И компиляция, и отладка под 64-бит не является проблемой. На выбор - MASM из состава последних Visual Studio (2005, 2008, 2010), FASM, NASM, YASM - все поддерживают создание 64-битных приложений. Про самоделки вроде MASM32 - не скажу, не пользуюсь. TASM давно умер.
Автор: bomzzz
Дата сообщения: 17.02.2011 14:16
люди че делать с резидентами. ну почему конфликт с волков командиром может быть?
Автор: xzGORzx
Дата сообщения: 02.03.2011 16:01
Здравствуйте.
Подскажите пожалуйста как на FASM можно сложить 2 hex значения?
Точнее даже так, есть переменная со значением 02A853B0h к ней нужно будет прибавлять
00000001h (0x1). Результат тоже нужен в hex. Подскажите пожалуйста, как это возможно реализовать?
Автор: akaGM
Дата сообщения: 02.03.2011 16:26
xzGORzx

Цитата:
Подскажите пожалуйста как на FASM можно сложить 2 hex значения?

да так же как и на других асмах или я что-то не понял...


Цитата:
Точнее даже так, есть переменная со значением 02A853B0h к ней нужно будет прибавлять 00000001h (0x1). Результат тоже нужен в hex.


var1 dd 02A853B0h
var2 dd 01h

mov eax, var1
add eax, var2
Автор: xzGORzx
Дата сообщения: 02.03.2011 17:12
Пробовал подобный код, вылезает ошибка с рассказом что память не может быть writhen и с предложением отладки.
Автор: Benchmark
Дата сообщения: 02.03.2011 17:27
xzGORzx
Приведи свой исходный код. Невозможно вслепую понять, где у тебя ошибка.

И еще непонятно условие задачи. В каком виде изначально у тебя два числа, которые надо сложить - в бинарном виде, или в виде текстовых строк ?
Ну то есть у тебя там что-то вроде:

Digit1 dd 02A853B0h
Digit2 dd 1

или

Digit1 db '02A853B0'
Digit1 db '1'

Если в виде текста (второй вариант), то их надо сначало сконвертировать в бинарный вид, сложить, а затем сконвертировать обратно.
Автор: akaGM
Дата сообщения: 02.03.2011 17:53
xzGORzx
у тебя наведённая ошибка в программе и я на 100% уверен, что дело не в неправильном сложении чисел...
Автор: xzGORzx
Дата сообщения: 02.03.2011 18:27
Вот исходник. Я каждую часть программы отдельно тестирую. Остальное работает бес проблем.

Код:
format PE GUI 4.0 at 7000000h

include 'C:\fasm\include\win32ax.inc'

.data

vo dd 02A853B0h
bo dd 00000001h

.code
start:
mov edx, vo
add edx, bo

.end start
Автор: Benchmark
Дата сообщения: 02.03.2011 18:42
xzGORzx

Цитата:
format PE GUI 4.0 at 7000000h

Вот это (выделенное) - вообще зачем ?

Вот рабочий код:

;----------------------------------------------
format PE CONSOLE 4.0
entry start
include 'win32ax.inc'

section '.code' code readable executable

start:
mov eax, [vo]
add eax, [bo]

invoke ExitProcess, 0

section '.data' data readable writable

vo dd 02A853B0h
bo dd 00000001h

section '.idata' import data readable writable

library kernel32, 'kernel32.dll'
import kernel32,\
ExitProcess, 'ExitProcess'
;----------------------------------------------


Цитата:
каким образом потом можно присвоить переменной vo значение edx ?


mov [vo], edx
Автор: xzGORzx
Дата сообщения: 02.03.2011 18:58
Спасибо громадное!
format PE GUI 4.0 at 7000000h Это я в каком-то хелпе прочитал, в другой программе на это не ругается.
Автор: Benchmark
Дата сообщения: 02.03.2011 19:07
xzGORzx

Цитата:
format PE GUI 4.0 at 7000000h Это я в каком-то хелпе прочитал, в другой программе на это не ругается.

Эта директива позволяет явно задать базовый адрес вместо стандартного 401000h для win32 exe'шников. Чаще имеет смысл для библиотек DLL. В данном случае совершенно ни к чему.
Автор: xzGORzx
Дата сообщения: 04.03.2011 19:48
Здравствуйте.
При попытке скомпилировать FASM'ом код в х64, его вырывает в этом месте:

Код:
push eax
pop [NTX]
Автор: Benchmark
Дата сообщения: 04.03.2011 21:00
xzGORzx

Цитата:
На х32 этот код работает нормально. Подскажите пожалуйста, в чем проблема?


Проблема, как нетрудно догадаться, в размере инструкций. Ты пытаешься в 64-бит приложении поместить в стэк значение 32-битного регистра. Этого сделать нельзя. Чтобы все заработало, код должен выглядеть так:

push rax
pop [NTX]

причем NTX в сегменте данных должен быть объявлен, как 64-битный. Например, так:

NTX dq 0
Автор: xzGORzx
Дата сообщения: 19.03.2011 15:59
Здравствуйте.
Такая проблема:
Нужно зациклить программу, без особой загрузки процессора, тк цикл будет выполняться по несколько 10-ков минут. И goto и jnz сильно грузят систему.
Цикл должен выполнялся до поступления данных в переменную.
Помогите пожалуйста, если возможно решить данную проблему.
Автор: Abs62
Дата сообщения: 19.03.2011 16:09
xzGORzx
Чтобы не грузилась система, надо не крутить циклы, что в любом случае будет отнимать процессорное время, а передавать это время другим выполняемым процессам. Такие задачи решаются не на уровне команд процессора, а вызовом соответствующих функций операционной системы.
Автор: Benchmark
Дата сообщения: 19.03.2011 16:54
xzGORzx
Если программа под Windows, то функции Sleep или SleepEx - именно то, что нужно.

Либо можно сделать чуть иначе - при поступлении данных в переменную генерировать собственный event или выставлять mutex, а "будить" цикл через WaitForSingleObject.
Автор: praidik
Дата сообщения: 20.03.2011 14:37
Здравствуйте.
У меня мало знаний по ассемблеру...
Нужно сделать одну задачу, можете подумать ерунда... но я голову уже вторую неделю ломаю, что и как...
Условие задачи такое...
Есть два числа (2 и 3) уже присвоенные в программе...
нужно сложить их и вывести результат на экран...
с задержкой разумеется, дабы увидеть ответ.

В понедельник уже сдать задачу нужно...
Автор: akaGM
Дата сообщения: 20.03.2011 14:40
praidik

Цитата:
Нужно сделать одну задачу, можете подумать ерунда... но я голову уже вторую неделю ломаю, что и как...

и где результаты этой двухнедельной головоломной деятельности?

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384

Предыдущая тема: .NET GUI компоненты


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.