使用 printf asm nasm 在一行中打印整个数组
Printing an entire array on a single line using printf asm nasm
我正在使用 NASM 编译我的 ASM 程序,但我无法弄清楚如何使用循环在一行上打印整个数组(不一定知道数组有多大)。每当我使用 printf 创建循环时,它都会在多行而不是一行上打印值。知道如何使用循环使 printf 在一行上打印数组的多个值吗?我得到值 1-9 但都在不同的行而不是同一行。这是在不使用外部库的情况下完成的,除了:printf c 库。非常感激任何的帮助。我的代码如下。
extern printf
SECTION .data ; Data section, initialized variables
array: dd 1, 2, 3, 4, 5, 6, 7, 8, 9, 0; this is a test array for testing purposes
arrayLen: dd 9 ; length of array
aoutput: db "%d", 10, 0 ; output format
SECTION .text ; Code section.
global main ; the standard gcc entry point
main: ; the program label for the entry point
push ebp ; set up stack frame
mov ebp,esp
mov ecx, [arrayLen] ; loop counter set up
mov esi, 0 ; counter to increment set up for looping through array
.loop:
push ecx ; make sure to put ecx (counter) on stack so we don't lose it when calling printf)
push dword [array + esi] ; put the value of the array at this (esi) index on the stack to be used by printf
push dword aoutput ; put the array output format on the stack for printf to use
call printf ; call the printf command
add esp, 8 ; add 4 bytes * 2
pop ecx ; get ecx back
add esi, 4
loop .loop
mov esp, ebp ; takedown stack frame
pop ebp ; same as "leave" op
mov eax,0 ; normal, no error, return value
ret ; return
唯一决定某些内容是单行打印还是多行打印的是是否打印换行符 (\n
)。
在这里,当您说 10
时,这是换行符的 ASCII 值。如果你改变这个:
aoutput: db "%d", 10, 0
对此:
aoutput: db "%d ", 0
您的值将由空格分隔,而不是换行。
在序列中的最终值之后,您可以打印一个单独的换行符:
push 0x0A ; New line character
call putchar
我想通了(和其他答案一样,我是在看到它发布之前才发现的)。
我想通了,我把格式定义改成:
aoutput: db "%d ", 0 ; output format
来自:
aoutput: db "%d ", 10, 0 ; output format
并且刚刚添加了换行格式以在末尾添加新行。
newline: db "", 10, 0 ; newline format
问题是您在每个元素之后输出一个换行符。
以下是两种解决方法。它们都没有像现有的两个解决方案那样存在尾随空白 space 的问题。
请注意,我对循环进行了轻微的重新排列以允许空数组。允许空数组是一个很好的做法,即使它不是必需的,因为它不需要任何额外的指令。
解决方案 1:如果它是最后一个元素,则使用 "%d\n"
作为格式,否则使用 "%d "
。
如果您不想为空数组打印换行符,这很好。
format1: db "%d ", 0
format2: db "%d", 10, 0
jmp .loop3
.loop1:
mov eax,format1
cmp ecx,1
jnz .loop2
mov eax,format2
.loop2
push ecx
push dword [array + esi]
push dword eax
call printf
add esp, 8
pop ecx
add esi, 4
.loop3:
loop .loop1
解决方案 2:如果它是第一个元素,则使用 "%d"
作为格式。否则使用 " %d"
作为格式。在循环后打印一个换行符。
如果您想打印空数组的换行符,这很好。
format1: db "%d", 0
format2: db " %d", 0
mov eax, format1
jmp .loop2
.loop1:
push ecx
push dword [array + esi]
push dword eax
call printf
add esp, 8
pop ecx
add esi, 4
mov eax, format2
.loop2:
loop .loop1
push 10
call putchar
如有错误请见谅;上次我为它编写程序集时,x86 没有 eax
寄存器。无论如何,逻辑应该是显而易见的。
我正在使用 NASM 编译我的 ASM 程序,但我无法弄清楚如何使用循环在一行上打印整个数组(不一定知道数组有多大)。每当我使用 printf 创建循环时,它都会在多行而不是一行上打印值。知道如何使用循环使 printf 在一行上打印数组的多个值吗?我得到值 1-9 但都在不同的行而不是同一行。这是在不使用外部库的情况下完成的,除了:printf c 库。非常感激任何的帮助。我的代码如下。
extern printf
SECTION .data ; Data section, initialized variables
array: dd 1, 2, 3, 4, 5, 6, 7, 8, 9, 0; this is a test array for testing purposes
arrayLen: dd 9 ; length of array
aoutput: db "%d", 10, 0 ; output format
SECTION .text ; Code section.
global main ; the standard gcc entry point
main: ; the program label for the entry point
push ebp ; set up stack frame
mov ebp,esp
mov ecx, [arrayLen] ; loop counter set up
mov esi, 0 ; counter to increment set up for looping through array
.loop:
push ecx ; make sure to put ecx (counter) on stack so we don't lose it when calling printf)
push dword [array + esi] ; put the value of the array at this (esi) index on the stack to be used by printf
push dword aoutput ; put the array output format on the stack for printf to use
call printf ; call the printf command
add esp, 8 ; add 4 bytes * 2
pop ecx ; get ecx back
add esi, 4
loop .loop
mov esp, ebp ; takedown stack frame
pop ebp ; same as "leave" op
mov eax,0 ; normal, no error, return value
ret ; return
唯一决定某些内容是单行打印还是多行打印的是是否打印换行符 (\n
)。
在这里,当您说 10
时,这是换行符的 ASCII 值。如果你改变这个:
aoutput: db "%d", 10, 0
对此:
aoutput: db "%d ", 0
您的值将由空格分隔,而不是换行。
在序列中的最终值之后,您可以打印一个单独的换行符:
push 0x0A ; New line character
call putchar
我想通了(和其他答案一样,我是在看到它发布之前才发现的)。
我想通了,我把格式定义改成:
aoutput: db "%d ", 0 ; output format
来自:
aoutput: db "%d ", 10, 0 ; output format
并且刚刚添加了换行格式以在末尾添加新行。
newline: db "", 10, 0 ; newline format
问题是您在每个元素之后输出一个换行符。
以下是两种解决方法。它们都没有像现有的两个解决方案那样存在尾随空白 space 的问题。
请注意,我对循环进行了轻微的重新排列以允许空数组。允许空数组是一个很好的做法,即使它不是必需的,因为它不需要任何额外的指令。
解决方案 1:如果它是最后一个元素,则使用 "%d\n"
作为格式,否则使用 "%d "
。
如果您不想为空数组打印换行符,这很好。
format1: db "%d ", 0
format2: db "%d", 10, 0
jmp .loop3
.loop1:
mov eax,format1
cmp ecx,1
jnz .loop2
mov eax,format2
.loop2
push ecx
push dword [array + esi]
push dword eax
call printf
add esp, 8
pop ecx
add esi, 4
.loop3:
loop .loop1
解决方案 2:如果它是第一个元素,则使用 "%d"
作为格式。否则使用 " %d"
作为格式。在循环后打印一个换行符。
如果您想打印空数组的换行符,这很好。
format1: db "%d", 0
format2: db " %d", 0
mov eax, format1
jmp .loop2
.loop1:
push ecx
push dword [array + esi]
push dword eax
call printf
add esp, 8
pop ecx
add esi, 4
mov eax, format2
.loop2:
loop .loop1
push 10
call putchar
如有错误请见谅;上次我为它编写程序集时,x86 没有 eax
寄存器。无论如何,逻辑应该是显而易见的。