好吧,我知道如何跳转一定次数(比如5次),但是当我尝试打印一个char时我遇到了一些问题:程序循环播放。 这就是我此时设法做的事情...... (以下所有内容均为代码)
section .data
letter db 65 ;A in ASCII
cont dw 5 ;The number of times it should print the letter
section .bss
section .text
global _start
_start:
;This is the printing of the letter
mov eax, 4
mov ebx, 1
mov ecx, letter
mov edx, 1
int 0x80
;And this is where I got stuck, it goes in a loop and I don't know how to fix this
mov ecx, [cont]
dec ecx
jnz _start
_fine: ;it ends the program
mov eax, 1
mov ebx, 0
int 0x80
答案 0 :(得分:2)
解释发生了什么:
mov ecx, [cont]
; you did load 32b value from memory into ecx
; lower 16bits are 5 (from "dw 5"), upper 16b undefined (probably 0 by luck)
dec ecx
; you decrement ecx to (4 + undefined upper 16b) (value in memory intact)
jnz _start
; and jump to _start
在第二次迭代期间,同样的事情发生了。实际上非常相同。包括内存中的值仍等于5 +。
您可以将计数器始终保留在某个寄存器中,因此请将其初始化为提前循环(如mov ecx,5
,然后在循环期间保留ecx
值)。
或者如果你想将它保留在内存中,dec
也可以在这种情况下使用内存:
dec WORD [cont]
; decrement only 16bit data, because "dw" was used to define word.
; in first iteration memory content would become 4 from 5
jnz _start
或者解决此类问题的另一种方法是将更新的值从寄存器存储到内存中:
mov cx, [cont] ; also fixed to 16b only to respect "dw"
dec cx
mov [cont], cx ; write new value back into memory
jnz _start
顺便说一句,在调试器中,这应该是明显。所以你要么没有尝试,要么你不理解调试器 - 它如何显示寄存器的值以及如何检查内存的内容。
在任何一种情况下,花几天时间学习如何使用调试器,因为在没有调试器的程序集中进行编程就像构建一个蒙着眼睛的机器人(你真的不想这样做)。