Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly NASM没有打印出我所有的指令;跳过代码块_Assembly_Nasm - Fatal编程技术网

Assembly NASM没有打印出我所有的指令;跳过代码块

Assembly NASM没有打印出我所有的指令;跳过代码块,assembly,nasm,Assembly,Nasm,我正在开发一个玩具NASM程序,它将把特定程序中的所有值相加。 我现在正在玩NASM,因为我正在构建我的程序,以了解一切是如何工作的 到目前为止,在我的程序中,我已经放置了一系列的输出,上面写着“工作”,这样我就可以缩小错误的范围 目前,我希望看到五份“工作”的打印件,但我只看到四份。显然,Output:下的代码无法打印,但我一辈子也弄不清原因 segment .data ;studentInfo: db 10,'Program by Raphael Stein', 10, '60796

我正在开发一个玩具NASM程序,它将把特定程序中的所有值相加。 我现在正在玩NASM,因为我正在构建我的程序,以了解一切是如何工作的

到目前为止,在我的程序中,我已经放置了一系列的输出,上面写着“工作”,这样我就可以缩小错误的范围

目前,我希望看到五份“工作”的打印件,但我只看到四份。显然,
Output:
下的代码无法打印,但我一辈子也弄不清原因

segment .data
    ;studentInfo: db 10,'Program by Raphael Stein', 10, '6079652', 10, 10 ;
    ;infoLen: equ $-studentInfo

    NUM_ROWS: equ 5
    NUM_COLUMNS: equ 5
    NUM_ROW_BYTES: equ 10

    ;Default matrix
    matrix: dw  5, 4, 9, 7, 2
        dw  1, 4, 6, 8, 7
        dw  9, 9, 2, 3, 7
        dw  6, 5, 8, 3, 4
        dw  1, 2, 8, 2, 6   
    matrixLen: equ $-matrix

    sum:    db "The sum of the last column is: ", 10

    ;FOR TESTING
    works: db 'Works!', 10
    worksLen: equ $-works

segment .bss
    counter resb 1

segment .text
    global main

main:
;------------------------------------------------------------------------
    mov eax, 4      ; system call 4
    mov ebx, 1      ; standard output 
    mov ecx, works      ; Works!            1
    mov edx, worksLen
    int 0x80
;-------------------------------------------------------------------------
    ;mov CX, NUM_ROWS           ;Works!
    mov ECX, counter
    sub AX, AX
    sub EBX, EBX
    mov ESI, NUM_COLUMNS-1


;------------------------------------------------------------------------
    mov eax, 4      ; system call 4
    mov ebx, 1      ; standard output 
    mov ecx, works      ; Works!            2
    mov edx, worksLen
    int 0x80
;------------------------------------------------------------------------


sum_loop:               
    add EAX, [matrix + EBX + ESI*2]
    add EBX, NUM_ROW_BYTES
    add ECX, 1
    cmp EAX,ECX
    mov esi, eax
    jge Output
    LOOP sum_loop

;------------------------------------------------------------------------
    mov eax, 4      ; system call 4
    mov ebx, 1      ; standard output 
    mov ecx, works      ; Works!            3
    mov edx, worksLen
    int 0x80
;-------------------------------------------------------------------------

Output:
    mov eax, 4  
    mov ebx, 1
    mov ecx, works
    mov edx, worksLen
    int 0x80


;------------------------------------------------------------------------
    mov eax, 4      ; system call 4
    mov ebx, 1      ; standard output 
    mov ecx, works      ; Works!            4
    mov edx, worksLen
    int 0x80
;-------------------------------------------------------------------------

EXIT:
    mov eax, 1
    xor ebx, ebx
    int 0x80

我在这里看到一些问题。无特定顺序:

  • 您确实希望将临时调试打印指令序列抽象为一个单独的函数。这将是一个很好的实践机会。这样做将消除代码重复,并可能消除一些bug。比如
  • 在sum_循环标签下,第一条指令添加到EAX。根据最近的修改(看起来像打印拷贝/粘贴),EAX是4
  • 所以在第一条ADD指令之后,EAX=4+address_of(matrix)+EBX+ESI*2。那将是。。。数量相当大(地址会使它变得很大)。代码将其与包含。。。“works”字符串的偏移量。同样,由于复制/粘贴,这看起来像是一个错误。ECX可能应该是计数器,在前面的块中定义
  • “jge Output”指令从上一条CMP指令(即“CMP EAX,ECX”)获取结果。这样做的净效果是:“如果(EAX>=ECX),则转到输出”。指针在.data部分中的排列方式与(有时是偶然的)数学结合表明这是正确的。这意味着
  • 正在执行输出标签下的代码。至少,我的阅读表明了这一点。您的各种调试打印不会真正提供任何正在触发的数据。我希望输出标签之前的调试打印块不会被执行
  • sum_回路意外短路可能是件好事。否则,它永远不会终止。读取x86循环指令——ECX递减,如果ECX不是0,它将分支。请注意,在每次迭代中,您将向ECX添加1。所以,它是这样做的:“ECX+=1;如果(--ECX!=0),则循环”。这永远不会结束
良好的开端和主动性。继续练习