Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.04.2014, 11:19   #1
CrashOveride
 
Регистрация: 17.11.2012
Сообщений: 3
По умолчанию Программирование на 64 битной OS

Добрый день, уважаемые. Хочу переделать программу которая работала на 32 битной ОС, под 64 битную. (про приемственность версий знаю) я хочу именно узнать различия программирования под разные ОС. Пишу на FASM. Программа генерирует случайное число методом Парка-Миллера. Вроде все делал по книжке, но программа не запускается на windows x64. Компилируется, но не запускается exe файл. подскажите, что не так, в чем проблема?
Книга - Аблязов Р.З. - Программирование на ассемблере на платформе x86-64 - 2011
Текст на FASM приведен ниже.

Код HTML:
format PE64 GUI 4.0
entry start
include 'C:\FASM\include\win64a.inc'
; Сегмент данных
section  '.data'  data readable writeable
    caption db 'Случайное число: ',0
    fmt db '%u',0
    buffer rb 12
 
    random_seed dd 0  ; Переменная для хранения промежуточных результатов
              ; работы генератора
 
    ; Сегмент кода
    section '.code' code readable executable
 start:
 
    ; Инициализация генератора
    stdcall  WRandomInit
    ; Получить случайное число в интервале  0...99999
    stdcall  WRandom
    ; EAX=случайное число
    ; Получить случайное число в интервале min...max (включая границы)
    stdcall  WIRandom,1,10000,1
    ; EAX=случайное число в интервале от 1 до 20
 
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ; тут должен быть вывод результата
    invoke wsprintf,buffer,'%u',eax
    invoke MessageBox,0,buffer,caption,MB_OK
    invoke ExitProcess,0
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
 
    ;---------------------------------------------
    ; Park Miller random number algorithm c частичной факторизац
    ; Получить случайное число 0 ... 99999
    ; stdcall WRandom
    ; на выходе EAX - случайное число
    ;I(j+1)=a*I(j)(mod m)
    ;a=7^5=16807, m=2^31-1=2147483647
    ;---------------------------------------------
    proc    WRandom
        push    rdx rcx
        mov     eax,[random_seed]
        xor     edx,edx
        mov     ecx,12773
        div     ecx
        mov     ecx,eax
        mov     eax,16807
        mul     edx
        mov     edx,ecx
        mov     ecx,eax
        mov     eax,2836
        mul     edx
        sub     ecx,eax
        xor     edx,edx
        mov     eax,ecx
        mov     [random_seed],ecx
        mov     ecx,999999999
        div     ecx
        mov     eax,edx
        pop     rcx rdx
        ret
    endp
     
    ;---------------------------------------------
    ; Получить случайное число в нужном интервале
    ; Требуется процедура WRandom
    ; stdcall WIRandom,min,max
    ; на выходе EAX - случайное число   
    ;---------------------------------------------
    proc    WIRandom rmin:dword,rmax:dword,modrr:dword
        push    rdx rcx
        mov     ecx,[rmax]
        sub     ecx,[rmin]
        inc     ecx
        stdcall WRandom
        xor     edx,edx
        div     ecx
        mov     eax,edx
        add     eax,[rmin]
 
 
        ;push eax
        xor edx,edx
        xor ebx,ebx
        xor ecx,ecx
        mov ebx,eax
 
        mov ecx,[modrr];0003h
 
        metka:
        xor edx,edx
        div ecx
        xor eax,eax
        cmp edx,0
        je exit
        inc ebx
        mov eax,ebx
        jmp metka
        exit:
        mov eax,ebx
 
        ;pop eax
 
 
        pop     rcx rdx
        ret
    endp
     
    ;---------------------------------------------
    ; Инициализация генератора случайных чисел
    ; stdcall WRandomInit 
    ;---------------------------------------------
    proc    WRandomInit
        push    rax rdx
        rdtsc
        xor     eax,edx
        mov     [random_seed],eax
        pop     rdx rax
        ret
    endp
 
 
 
section '.idata'  import data readable writeable
library kernel32,'KERNEL32.DLL',\
user32,'USER32.DLL'
import kernel32,\
ExitProcess,  'ExitProcess'
import user32,\
MessageBox,'MessageBoxA',\
wsprintf,'wsprintfA'
CrashOveride вне форума Ответить с цитированием
Старый 29.04.2014, 12:47   #2
vadimych
Форумчанин
 
Регистрация: 16.01.2011
Сообщений: 325
По умолчанию

CrashOveride, я Вам ответил на другом форуме. Пользуйтесь Windbg, чтобы разобраться в своём коде, это будет полезнее, чем создавать одинаковые темы на всех форумах подряд.

Последний раз редактировалось vadimych; 29.04.2014 в 17:25.
vadimych вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа 32 битной програмки под 64 Anton911 Общие вопросы Delphi 14 31.03.2013 18:53
SaveToFile в 32 битном приложении на 64 битной ОС. XerSon Общие вопросы Delphi 15 28.12.2012 12:37
Программирование на Си в 64 битной системе MrBrain Общие вопросы C/C++ 3 13.12.2011 10:22
Чайник с 64 битной системой Руслан Сабиров Свободное общение 5 28.10.2011 14:18
RC6 на 32 битной платформе. Ghost of Night Общие вопросы Delphi 0 02.07.2011 01:14