NASM中不修改HelloWorld字符串实现逐字符换行输出求助
NASM汇编实现逐字符换行输出(不修改原字符串)
原代码逻辑是遇到空格时换行输出一段字符,现在需要不改动HelloWorld字符串的前提下,让每个字符单独占一行输出。
原代码
%macro nwln 0 call proc_nwln %endmacro SYS_EXIT equ 1 SYS_READ equ 3 SYS_WRITE equ 4 STDIN equ 0 STDOUT equ 1 section .text global _start _start: mov ecx,msg3 mov edx,0 ; Set the length jmp lab2 lab2: cmp [ecx],byte ' ' je lab1 cmp [ecx], byte 0 je lab3 inc edx inc ecx jmp lab2 lab1: sub ecx,edx mov eax, SYS_WRITE mov ebx, STDOUT int 80h nwln add ecx, edx inc ecx mov edx,0 jmp lab2 lab3: sub ecx,edx mov eax, SYS_WRITE mov ebx, STDOUT int 80h nwln mov eax, SYS_EXIT int 80h proc_nwln: pusha mov eax, SYS_WRITE mov ebx, STDOUT mov ecx, new_line mov edx, 0x1 int 0x80 popa ret segment .data msg3 db 'HelloWorld', 0xa new_line db 0x0a
修改后的代码
%macro nwln 0 call proc_nwln %endmacro SYS_EXIT equ 1 SYS_READ equ 3 SYS_WRITE equ 4 STDIN equ 0 STDOUT equ 1 section .text global _start _start: mov ecx, msg3 ; 指向字符串起始地址 next_char: cmp byte [ecx], 0x0a ; 判断是否到达原字符串末尾的换行符 je exit_program ; 到达则退出 mov eax, SYS_WRITE mov ebx, STDOUT mov edx, 1 ; 每次仅输出1个字符 int 0x80 nwln ; 输出换行符 inc ecx ; 指针移动到下一个字符 jmp next_char ; 循环处理下一个字符 exit_program: mov eax, SYS_EXIT int 0x80 proc_nwln: pusha mov eax, SYS_WRITE mov ebx, STDOUT mov ecx, new_line mov edx, 0x1 int 0x80 popa ret segment .data msg3 db 'HelloWorld', 0xa new_line db 0x0a
改动说明
- 移除原代码中基于空格分割、累计字符长度的逻辑,改为逐个遍历字符串字符
- 每次系统调用
SYS_WRITE时固定输出长度为1,确保只输出当前单个字符 - 输出字符后立即调用
nwln输出换行,实现逐字符换行 - 终止条件改为判断原字符串末尾的
0xa(原字符串定义自带的换行符),避免处理多余字符
内容的提问来源于stack exchange,提问作者kilzah
相关产品推荐
相关产品推荐

