我正在开发一个程序 - 应该很简单 - 在使用NASM和x86 Intel汇编语法的Linux操作系统上。
我遇到的问题是我无法为我的程序创建一个工作循环:
section .data
hello: db 'Loop started.', 0Ah ;string tells the user of start
sLength: equ $-hello ;length of string
notDone: db 'Loop not finished.', 0Ah ;string to tell user of continue
nDLength: equ $-notDone ;length of string
done: db 'The loop has finished', 0Ah ;string tells user of end
dLength: equ $-done ;length of string
section .text
global _start:
_start:
jmp welcome ;jump to label "welcome"
mov ecx, 0 ;number used for loop index
jmp loop ;jump to label "loop"
jmp theend ;jump to the last label
welcome:
mov eax, 4
mov ebx, 1
mov ecx, hello
mov edx, sLength
int 80 ;prints out the string in "hello"
loop:
push ecx ;put ecx on the stack so its value isn't lost
mov eax, 4
mov ebx, 1
mov ecx, notDone
mov edx, nDLength
int 80 ;prints out that the loop isn't finished
pop ecx ;restore value
add ecx, 1 ;add one to ecx's value
cmp ecx, 10
jl loop ;if the value is not ten or more, repeat
theend:
;loop for printing out the "done" string
我正在打印第一个字符串,一个“未完成”并打印出最后一个字符串;我错过了九个“未完成”!有没有人知道为什么我会失去ecx寄存器的价值?
谢谢。
答案 0 :(得分:1)
您正在将循环寄存器ecx初始值设置为" hello"的地址,而不是0:
jmp welcome
(mov ecx, 0) ;number used for loop index <- jumped over
...
welcome:
...
mov ecx, hello <- setting
int 80 <- ecx
...
loop:
push ecx ;put ecx on the stack so its value isn't lost
答案 1 :(得分:1)
_start:
jmp welcome
这意味着JMP下面的所有代码都没有被执行,尤其是mov ecx,0(对于更短的指令,它应该是 xor ecx,ecx )
不要从跳转开始,先从一些代码开始。 JMP是一个跳跃,跳跃后它不会回来,只是继续执行。
所以在跳转到Welcome:之后,你直接转到Loop:,因此错过了ecx = 0代码。
cmp ecx, 10
jl loop
ECX不是0,它肯定大于10h,所以不采用循环。
试试这个:
_start:
mov eax, 4
mov ebx, 1
mov ecx, hello
mov edx, sLength
int 80 ;prints out the string in "hello"
xor ecx,ecx ;ecx = 0
loop:
push ecx ;save loop index
mov eax, 4
mov ebx, 1
mov ecx, notDone
mov edx, nDLength
int 80 ;prints out that the loop isn't finished
pop ecx ;get loop index back in ECX
add ecx, 1 ;add one to ecx's value
cmp ecx, 10
jl loop ;if the value is not ten or more, repeat
theend: