Пятница, 2025-06-20, 2:51 PM
Приветствую Вас Гость | RSS
Главная | Внешние процедуры | Регистрация | Вход
Меню сайта
Вход на сайт
Поиск
Друзья сайта
  • Официальный блог
  • Сообщество uCoz
  • FAQ по системе
  • Инструкции для uCoz
  • Программирование

    Внешние процедуры в языке Ассемблер. Процедуры в Assembler

     

     

    Пример: Написать программу на ассемблере вычисления выражений: ab - c/d 

    где а =5; 
    b =27; 
    c = 86; 
    е =1986; 
    d =1112;

    Текст программы 
    1 Главная программа

    .386                ; директива определения типа микропроцессора
    .model flat           ; задание линейной модели памяти 
    option casemap:none 
    extern _abcd:proc          ; указывание на внешнюю процедуру
    public _a, _b,_c, _d       ; доступ для других модулей 
    .data    ; директива определения данные    
    _a   dw  5  ; запись в 32-разрядный амбарчик с именем _а 
    _b   dw  27      
    _c   dw  86   ; запись в 32-разрядный амбарчик с именем _с 
    _d   dw  1112     ; запись в 32-разрядный амбарчик с именем _d 
    _e   dw  1986 
    _res  dw 2 dup(0)             ; переменная для сохранения результата 
    .code             ; директива начала программы 
    _start:             ; метка начала программы с именем start 
    call _abcd       ; вызов процедуры 
    push EAX 
    mov _res[0],si                 ; запоминание дробной части в памяти 
    mov _res[4],di                 ; запоминание дробной части в памяти 
    ;mov _res[8],cx               ; запоминание дробной части в памяти 
    ret         ; возвращение управления ОС 
    end _start                  ; директива окончания программы с именем start

    2 Текст процедуры программы

    .686              ; директива определения типа микропроцессора 
    .model  flat                     ; задание линейной модели памяти 
    option casemap:none 
    public _abcd 
    extern _a:dword, _b:dword, _c:dword,_d:dword 
    .code           ; директива начала программы 
    _abcd proc      ;  ab - c/d 
    mov  eax,_a    ; пересылка из памяти с именем _а в eax 
    mov  ebx,_b    ; пересылка из памяти с именем _b в ebx 
    mul ebx           ; edx, eax := eax ? ebx 
    mov esi,eax 
    mov edi,edx 
    mov eax,_c 
    mov ebx,_d 
    xor edx,edx     ; подготовление к делению 
    div ebx 
    mov ecx,0 
    sub ecx,edx     ; вычитание мелкой части из целого числа 
    sbb esi,eax                 ; вычитание целой младшей части 
    sbb edi,0                          ; вычитание позычки, если она есть 
    ret 
    _abcd  endp 
    end      ; директива окончания программы


    Результат работы программы


    uCozCopyright MyCorp © 2025