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

    Директивы условного ассемблирования. Условие в Ассемблере

     

     

    Пример: Проанализировать массив данных из 16 элементов. Подсчитать и вывести на экран количество элементов, которые по значению находятся в середине диапазона от 32 до 128.

    Текст программы:

    .686               ; директива определения типа микропроцессора 
    .model flat,stdcall                      ; задание линейной модели памяти 
    option casemap:none          ; отличие малых и больших букв 
    include \masm32\include\windows.inc 
    include \masm32\include\kernel32.inc 
    include \masm32\include\fpu.inc 
    include \masm32\include\user32.inc 
    include \masm32\include\msvcrt.inc 
    includelib \masm32\lib\user32.lib 
    includelib \masm32\lib\kernel32.lib 
    includelib \masm32\lib\msvcrt.lib 
    includelib \masm32\lib\fpu.lib

    .data              ; директива определения данные 
    _c dd 40 
    sum dd 0 
    op1 dd 32 ; пределы 
    op2 dd 128    ; пределы 
    frmt db "%d",0 
    buf db 30 dup(?) 
    stdout DWORD ? 
    stdin DWORD ? 
    cRead dd ? 
    temp dd ? 
    mas1 dd 41 dup(0)

    st1 db "Vvesty masiv: " 
    st2 db "Вывод количества элементов в пределах (32,128) массива! С", 0 
    st3 db 10 dup(0) 
    ifmt db "количество = %d",0

    .code                ; директива начала кода программы 
    _start: 
    lea esi, mas1          ; загрузка адреса начала массива 
    mov ecx,_c 
    m1: 
    mov ebx,ecx 
    invoke GetStdHandle,STD_OUTPUT_HANDLE 
    mov stdout,eax 
    invoke GetStdHandle,STD_INPUT_HANDLE 
    mov stdin,eax 
    invoke WriteConsoleA,stdout,ADDR st1,14,NULL,NULL ; VIVOD ST1 
    invoke ReadConsole,stdin,ADDR buf,20 
    ADDR cRead,NULL ; чтения числа как символ 
    invoke crt_atoi,ADDR buf ; преобразовать символ в число 
    mov [esi],eax 
    add esi,4 
    mov ecx,ebx 
    loop m1 
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    mov ecx,_c 
    lea esi, mas1          ; загрузка адреса начала массива 
    mov eax [esi]            ; загрузка числа 
    m3: 
    .IF(eax>op1)&&(eax<op2) ; сложное условие 
    inc sum 
    add esi,4                    ; расчет адреса нового числа 
    mov eax[esi] 
    loop m3    

    .ELSE             ; иначе 
    add esi,4                    ; расчет адреса нового числа 
    mov eax[esi] 
    loop m3                  ; перейти, если ecx не равно 0

    .ENDIF                     ; окончание директивы высокого уровня

    mov ebx,sum

    invoke wsprintf \ 
    ADDR st3 \ 
    ADDR ifmt \ 
    ebx 
    invoke MessageBox \ 
    NULL \ 
    addr st3 \ 
    addr st2 \ 
    MB_OK 
    invoke ExitProcess,0 
    ret 
    end _start      ; конец программы

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



    uCozCopyright MyCorp © 2025