2017-06-27 51 views
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 
+4

'ABS'是一个过程,这意味着它是代码。因此,它应该放在'.CODE'部分下。 (另外,值得一提的是,还有其他几种写'ABS'的方法,这将大大提高效率,但我想这只是一个关于分支的学习练习。) –

+0

是的,你是对的。这只是分支练习。它正在工作。谢谢 – mwater07

+0

当您运行代码时,您没有收到错误,但是当您尝试编译/汇编代码时,这些都是编译时错误。程序集中的运行时错误看起来有点不同......基本上任何随机效应都是可能的,或者至少是现代操作系统对于随机机器代码执行是惊人的坚固,但是对于早期的计算机,汇编代码中的任何错误通常以重启整个机器(在某些外部存储设备上失去了以前未保存的任何进度)。 – Ped7g

回答

4

我需要下.CODE部移动ABS过程:

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