You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在x86汇编中用单printf调用加跳转循环3次打印指定字符串

修改要点
  • 首先修正原代码jolly字符串的冗余内容:原字符串多写了一个is,和要求打印的目标字符串不符,直接删除即可
  • 新增循环逻辑:使用ecx寄存器作为循环计数器,初始赋值为3,对应需要打印的次数
  • 调用printf前先压栈保存ecx的值,避免函数调用修改寄存器值导致循环计数异常,调用完成后再恢复ecx
  • 每次打印完成后将ecx减1,判断结果不为0就跳回循环起始位置,完成3次打印后再执行后续的deny字符串打印逻辑
  • 全程只写了一次_printf调用指令,完全符合评分规则要求
修改后完整代码
global  _main
extern  _printf
extern  _ExitProcess@4

section .bss
name:      resb 100
position1: resz 1
position2: resz 1
position3: resz 1

section .data
; 修正了原字符串多出来的is,和要求的输出一致
jolly:  db "For he's a jolly good fellow!", 0ah, 0
deny:   db 'Which nobody can deny!', 0ah, 0

section .text
        
_main:
        mov ecx, 3          ; 初始化循环计数器,总共打印3次
print_loop:
        push ecx            ; 保存ecx的值,防止printf调用修改寄存器
        push jolly          ; 传入待打印的字符串参数
        call _printf
        add esp, 4          ; 恢复栈指针
        pop ecx             ; 恢复循环计数器
        dec ecx             ; 计数器减1
        jnz print_loop      ; 如果计数器不为0,跳转回循环开头继续打印

        ; 3次打印完成后输出结尾字符串
        push   deny          
        call   _printf
        add    esp, 4        

        xor     ecx,ecx      
        call    _ExitProcess@4

内容的提问来源于stack exchange,提问作者Nicolas Ray

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 22:57:04