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