Абсолютное значение массива сборки

Я пытаюсь написать процедуру сборки, которая получает параметр в регистре ebx и возвращает абсолютное значение параметра в регистре eax, затем вызывает эту процедуру в цикле, чтобы посетить все элементы данного массива и получить их абсолютные значения. Когда я запускаю код, я получаю следующие ошибки сегмента от ассемблера.

 Assembling: abs.asm
abs.asm(3) : error A2034: must be in segment block : ABS
abs.asm(4) : error A2034: must be in segment block : $$$00001
abs.asm(4) : error A2034: must be in segment block
abs.asm(5) : error A2034: must be in segment block : $$$00001
abs.asm(5) : error A2034: must be in segment block
abs.asm(6) : error A2034: must be in segment block : $$$00001
abs.asm(6) : error A2034: must be in segment block
abs.asm(7) : error A2034: must be in segment block : $$$00001
abs.asm(7) : error A2034: must be in segment block
abs.asm(8) : error A2034: must be in segment block
abs.asm(9) : error A2034: must be in segment block : $$$00001
abs.asm(9) : error A2034: must be in segment block
abs.asm(10) : error A2034: must be in segment block
abs.asm(11) : fatal error A1010: unmatched block nesting : ABS
INCLUDE Irvine32.inc

ABS PROC
cmp ebx,0       ;compare ebx to zero
jle L1          ;Jump if less then or equal to zero
mov eax, ebx    ;copy ebx to eax, means eax is positive
Jmp L2          ;jumps to label return
L1:neg ebx      ;negates ebx    
mov eax,ebx     ;copy neagted ebx to eax        
L2:ret
ABS ENDP

.DATA
arrayW SDWORD 3, -2, 5, 7, 2, 9, -11, 32, -19, 18, 17, 15, -5, 2, 3, 1, -21, 27,-29, 20

.CODE
main PROC

    mov esi, OFFSET arrayW      ;address of arary
    mov ecx, LENGTHOF arrayW    ;loop counter

top:
    mov ebx,[esi]               ; move first element of arrayw to ebx
    call ABS                    ; calls procedure abs and gets the eax value
    call Writeint               ; displays eax  
    add esi, TYPE arrayW        ;points next element in array
    loop top                    ;loop goes to the top
    call clrscr

    exit
main ENDP

END main

1 ответ

Мне нужно было переместить ABS процедура по .CODE раздел:

INCLUDE Irvine32.inc

.DATA

arrayW SDWORD 3, -2, 5, 7, 2, 9, -11, 32, -19, 18, 17, 15, -5, 2, 3, 1, -21, 27,-29, 20


.CODE

ABS PROC
    cmp ebx,0       ;compare ebx to zero
    jle L1          ;Jump if less then or equal to zero
    mov eax, ebx    ;copy ebx to eax, means eax is positive
    jmp L2          ;jumps to label return
    L1:neg ebx      ;negates ebx    
    mov eax,ebx     ;copy neagted ebx to eax        
    L2:ret
ABS ENDP

main PROC

    mov esi, OFFSET arrayW      ;address of arary
    mov ecx, LENGTHOF arrayW    ;loop counter

top:
    mov ebx,[esi]               ;move first element of arrayw to ebx
    call ABS                    ;calls procedure abs and gets the eax value
    call Writeint               ;displays eax
call Crlf   
    add esi, TYPE arrayW        ;points next element in array
    loop top                    ;loop goes to the top

    exit
main ENDP

END main
Другие вопросы по тегам