[ Assembler ] — начинающим: задаем вопросы

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by !_filin_!, 25 May 2007.

  1. De-visible

    De-visible [NDC] Network develope c0ders

    Joined:
    6 Jan 2008
    Messages:
    916
    Likes Received:
    550
    Reputations:
    66
    Сам себя чуть не понял....
    ты говоришь любой генерирует! так значит он переводит!
    Только как просмотреть!
    Именно код моей проги чтобы ничего лишнего!
     
  2. GoreMaster

    GoreMaster Elder - Старейшина

    Joined:
    28 May 2007
    Messages:
    119
    Likes Received:
    32
    Reputations:
    4
    В отладчике
     
  3. De-visible

    De-visible [NDC] Network develope c0ders

    Joined:
    6 Jan 2008
    Messages:
    916
    Likes Received:
    550
    Reputations:
    66
    там вообще ужас!
    это не то!
     
  4. zl0y

    zl0y Banned

    Joined:
    13 Sep 2006
    Messages:
    371
    Likes Received:
    270
    Reputations:
    109
    к примеру :
    компилер делфи выделит блок памяти(в 4 байта для каждой переменной i и c)
    после чего сгенерит следующий код в представлении ассемблера:
     
  5. Sinex

    Sinex Elder - Старейшина

    Joined:
    17 Aug 2006
    Messages:
    111
    Likes Received:
    24
    Reputations:
    5
    Помогите пожалуйста:
    Присвоить в AX какое-то число.
    Подсчитать в BX кол-во нулевых цифр слева.
    Пример: AX = 0070h - BX => 2

    + всем кто как-нибудь поможет ;) заранее спасибо
     
  6. dinar_007

    dinar_007 Мадемуазель

    Joined:
    18 Jan 2005
    Messages:
    1,019
    Likes Received:
    770
    Reputations:
    97
    Ох уж этот assembler
    Долго вспоминал, какакая команда возвращает номер первого бита слева, который равен единице... bsr :)

    Code:
    mov ax, 0070h
    bsr bx, ax
    jnz @lab0:
    mov bx, 4
    jmp @lab1:
    @lab0:
    shr bx, 2
    @lab1:
    shr bx, 2 эквивалентно bx := bx / 4
     
    #186 dinar_007, 18 Jan 2008
    Last edited: 19 Jan 2008
    4 people like this.
  7. Piflit

    Piflit Banned

    Joined:
    11 Aug 2006
    Messages:
    1,249
    Likes Received:
    585
    Reputations:
    31
    omg. а если там будет 0170h?
     
  8. dinar_007

    dinar_007 Мадемуазель

    Joined:
    18 Jan 2005
    Messages:
    1,019
    Likes Received:
    770
    Reputations:
    97
    0170h это 0000000101110000b
    команда bsr запишет в bx значение 7, а команда shr bx,2 поделит целочисленно на 4, будет 1
     
  9. Minimus

    Minimus New Member

    Joined:
    22 Sep 2007
    Messages:
    7
    Likes Received:
    4
    Reputations:
    0
    вот только начал читать книжку по асму....первый же исходник не компилируется, ругается на offset message, помогите кто чем может :)
    Code:
     .model     small             
            .stack     100h       
            .code
    start:  mov        ax,DGROUP 
            mov        ds,ax          
            mov        dx,offset message
            mov        ah,9
            int        21h               
            mov        ax,4C00h
            int        21h               
            .data
    message db         "Hello World!",0Dh,0Ah,'$'
            end        start
    
    p.s. компилятор TASM
     
    2 people like this.
  10. z01b

    z01b Муджахид

    Joined:
    5 Jan 2007
    Messages:
    494
    Likes Received:
    382
    Reputations:
    22
    Пробуй вместо offset, addr
     
  11. AFoST

    AFoST Elder - Старейшина

    Joined:
    28 May 2007
    Messages:
    588
    Likes Received:
    485
    Reputations:
    176
    или
    lea dx,message вместо mov dx,offset message
     
  12. GlOFF

    GlOFF Elder - Старейшина

    Joined:
    8 May 2006
    Messages:
    689
    Likes Received:
    484
    Reputations:
    4
    Непонятно почему люди начинают с win16 )))
     
  13. Delimiter

    Delimiter Banned

    Joined:
    8 Apr 2005
    Messages:
    317
    Likes Received:
    173
    Reputations:
    12
    моделька досовская.... в принцыпе можно было не заморачиваться
    а заменить mov на lea и грузить реальный адрес а не смещение.
     
  14. TruPAC

    TruPAC Elder - Старейшина

    Joined:
    20 Dec 2007
    Messages:
    29
    Likes Received:
    6
    Reputations:
    0
    хочу написать прогу которая выводит текущий ип в плане освоения диалоговых окон.
    есть примерно такого вида наработка вызова модального диалогового окна. она находиться в конце, чтобы не мусорить вопрос. вообщем проблема в том что я не могу заставить его работать - оно просто не отображается. те происходит вызов функции и возвращаемое значение равно -1, что не есть гуд.

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

    вообщем они самые наработки.
    жаль что приатачить нельзя, но думаю в ресурсах ошибки быть не должно, так что их не выписываю.

    ну и теперь: как это заставить работать?

    Code:
       
       .386
       .model flat,stdcall
       option casemap:none
    
       DlgProc proto :DWORD,:DWORD,:DWORD,:DWORD
    
       include \masm32\include\windows.inc
       include \masm32\include\user32.inc
       include \masm32\include\kernel32.inc
       includelib \masm32\lib\user32.lib
       includelib \masm32\lib\kernel32.lib
    
       .data
       DlgName db "MyDialog",0
          AppName db "First",0
          
    
       .data?
       hInstance HINSTANCE ?
       
       .const
       MyDialog        equ 101
       IDC_IPADDRESS1  equ 1000
       IDM_EXIT        equ 32003
    
    
       .code
    
       start:
    
           invoke GetModuleHandle, NULL
           mov    hInstance,eax
           invoke DialogBoxParam, hInstance, ADDR DlgName,NULL, addr DlgProc, NULL
           invoke ExitProcess,eax
    
       DlgProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
           .IF uMsg==WM_INITDIALOG
               invoke GetDlgItem, hWnd,IDC_IPADDRESS1
               invoke SetFocus,eax
           .ELSEIF uMsg==WM_CLOSE
               invoke SendMessage,hWnd,WM_COMMAND,IDM_EXIT,0
           .ENDIF
           mov eax,TRUE
    
           ret
    
       DlgProc endp
    
       end start
    
     
  15. GlOFF

    GlOFF Elder - Старейшина

    Joined:
    8 May 2006
    Messages:
    689
    Likes Received:
    484
    Reputations:
    4
    TruPAC При вызове функции
    DlgName - не должен быть DlgName db "MyDialog",0 Это индетификатор описания окна, который по идеи храниться в ресурсе, также как и IDC_IPADDRESS1...

    По идеи у тебя уже обьявлен индетификатор окна
    Русурсы ты не выложил, поэтому можно предпологать, что с ними все ок! Поэтому есть вариант попробывать так...
    Окно должно создасться с условием если описание окна в ресурсах соответствует спецификациям :)
     
    2 people like this.
  16. Flame of Soul

    Flame of Soul Elder - Старейшина

    Joined:
    25 May 2007
    Messages:
    185
    Likes Received:
    146
    Reputations:
    45
    маленькие проблемки

    Приветики, у меня есть вопросик, но сначала обрисую ситуацию.

    Сидела я как то вечером перед монитором и решила написать свою маленькую ось, дабы закрепить азы асемблера. А сама блондинка блондинкой в этом. Взяла копы книжек в королевстве дежавю и замке пдф. Сходила к старцу васму. Послала гонцов в гугль. В итоге написала загрузчика (конечно же на дискетку((((). Написала ядро для нее. Теперь вопрос (простите Выпросы:)

    у меня с загрузчика на ядро управление передаеться :
    да кстати ось работает в текстовом режиме 80х25

    собственно вопрос вот в чем:
    когда я ввожу команду, она идет на выполнение, вот пример:

    Как сделать так чтобы при вводе команды, допустим "tasm" у меня запускался внешний файл "exe" or "com" любой. То есть независимо от адресного пространства?

    Я не знаю как назвать это, ну то есть чтобы можно было осуществить выход за пределы ядра, как бы мультизадачность.
     
  17. ProTeuS

    ProTeuS --

    Joined:
    26 Nov 2004
    Messages:
    1,239
    Likes Received:
    542
    Reputations:
    445
    это не ОС никакая...
    по4ему под 16разрядн. пишем? проще под винь и invoke ShellExecute
     
    1 person likes this.
  18. Flame of Soul

    Flame of Soul Elder - Старейшина

    Joined:
    25 May 2007
    Messages:
    185
    Likes Received:
    146
    Reputations:
    45

    ))) блин а я то дура думала, есив я загружаюсь с дискетки, меня приветствует загрузчик, потом появляеться приветствие ОС и в итоге я могу выполнять некоторые команды - это однозадачная ос, а оказываеться нет, да при том она и 16 разрядная? какая досада((( не гони. Есив это написано и откомпиленно не на тасме и не на масме то это не значит что это 16 разрядный асемблер.

    вопрос был другой как с ядра обращаться к посторонним файлам.
     
  19. Delimiter

    Delimiter Banned

    Joined:
    8 Apr 2005
    Messages:
    317
    Likes Received:
    173
    Reputations:
    12
    А Dos и есть и был однозадачный. Там и ядра то не было.... и у тебя не будет! Есть БИОС таблица прерываний.....часть БИОСА часть под Dos заточена....там все есть,что тебе нужно! А грузится все энто бизобразие в единое адресное пространство 640Килобайт 8)).. соответственно расслабься грузи программу в память определяй точку входа и передавай управление.

    Или "вытесняющая многозадачность"мастдая вьелась в моск?

    А вообще мадам.... вы похоже идете в сторону MBR вируса... дык зайдите на lab29a... возьмите лучший образец и "думайте" ....там то управление передается на оригинальный загрузчик.
     
    #199 Delimiter, 6 Feb 2008
    Last edited: 6 Feb 2008
  20. Flame of Soul

    Flame of Soul Elder - Старейшина

    Joined:
    25 May 2007
    Messages:
    185
    Likes Received:
    146
    Reputations:
    45
    это я все просматрела. На счет доса и много задачности.
    Я в замешательстве. Есть разница между графическим и текстовым режимом?
    а то вот тут я наблюдаю много задачность Manuet OS v0.78.;)
    под Fat 12 так е на флопике. Имеет возможность запускать файлы и работать с ними не зависимо от адресного пространства. И там и у меня система 32-х битная.

    Со всей симпатией за помощь в развитии моих знаний Delimiter но как это понимать?

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

    PS: DOS -дисковая операционная система, не все они однозадачные:)

    В реальном режиме мы имеем 640Kb памяти - 10 сегментов по 64Kb. В первый сегмент лучше не соваться - эта область BIOS. Для простоты предположим, что каждая задача нашей ОС - это COM файл MS-DOS.

    COM-программы содержат единственный сегмент (или, во всяком случае, не содержат явных ссылок на другие сегменты). Образ COM-файла считывается с диска и помещается в память, начиная с PSP:0100. Притом COM-программа может использовать множественные сегменты, но она должна сама вычислять сегментные адреса, используя PSP как базу.

    В MS-DOS после загрузки двоичного образа:

    задача при загрузке файла проделать те-же самые действия, что-бы программы ни коим образом не догадывалась об отстутствии ее родной ОС.

    Предположим, что каждая COM-программа занимает в памяти один сегмент.
    18.2 раза в секунду приходит аппаратное прерывание, и процессор отвлекается на выполнение некоторой процедуры - восьмого прерывания (int 08h). При этом он сохраняет в стеке регистр флагов (PUSHF), и регистры указывающие на текущую команду (CS:IP) (PUSH CS, PUSH IP). Всего 6 байт. После окончания аппаратного прерывания эти регистры восстанавливаются и основная программа продолжает свое выполнение.

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

    При наилучшем раскладе возможна загрузка восьми задач - 640Kb/64Kb=10, то есть всего имеем десять сегментов - один под переменные DOS, и один под ядро, вот и остается только восемь.