如何在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
相关产品推荐
相关产品推荐

