0
我正在尝试编写汇编程序,它接收寄存器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
'ABS'是一个过程,这意味着它是代码。因此,它应该放在'.CODE'部分下。 (另外,值得一提的是,还有其他几种写'ABS'的方法,这将大大提高效率,但我想这只是一个关于分支的学习练习。) –
是的,你是对的。这只是分支练习。它正在工作。谢谢 – mwater07
当您运行代码时,您没有收到错误,但是当您尝试编译/汇编代码时,这些都是编译时错误。程序集中的运行时错误看起来有点不同......基本上任何随机效应都是可能的,或者至少是现代操作系统对于随机机器代码执行是惊人的坚固,但是对于早期的计算机,汇编代码中的任何错误通常以重启整个机器(在某些外部存储设备上失去了以前未保存的任何进度)。 – Ped7g