string – x86 ASM Linux – 创建一个循环

string – x86 ASM Linux – 创建一个循环,第1张

概述我正在开发一个程序 – 应该很简单 – 在使用NASM和x86 Intel汇编语法的 Linux *** 作系统上. 我遇到的问题是我无法为我的程序创建一个工作循环: section .data hello: db 'Loop started.', 0Ah ;string tells the user of start sLength: equ $-hello 我正在开发一个程序 – 应该很简单 – 在使用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 stringsection .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 labelwelcome:    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,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,repeattheend:;loop for printing out the "done" string

我正在打印第一个字符串,一个“未完成”,最后一个字符串打印出来;我错过了九个“未完成”!有没有人知道为什么我会失去ecx寄存器的价值?

谢谢.

解决方法
_start:    jmp welcome

这意味着JMP下面的所有代码都没有执行,尤其是mov ecx,0(对于更短的指令,应该是xor ecx,ecx)

不要从跳转开始,从一些代码开始.一个JMP是一个跳跃,它在你跳跃之后不会回来,它只是继续执行.

所以在跳转到Welcome:之后,你直接转到Loop:,因此错过了ecx = 0代码.

cmp ecx,10jl loop

ECX不是0,它肯定大于10h,所以不采用循环.

试试这个:

_start:    mov eax,sLength    int 80              ;prints out the string in "hello"    xor ecx,ecx         ;ecx = 0loop:    push ecx            ;save loop index    mov eax,nDLength    int 80              ;prints out that the loop isn't finished    pop ecx             ;get loop index back in ECX    add ecx,repeattheend:
总结

以上是内存溢出为你收集整理的string – x86 ASM Linux – 创建一个循环全部内容,希望文章能够帮你解决string – x86 ASM Linux – 创建一个循环所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/1032354.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-24
下一篇 2022-05-24

发表评论

登录后才能评论

评论列表(0条)

保存