Абсолютное значение массива сборки
Я пытаюсь написать процедуру сборки, которая получает параметр в регистре 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