我想使用NASM程序在更大的 ASCII-Matrices 中打印数字。像点阵显示,但只有ASCII字符。在我的程序中,我只能显示一个数字,但我无法在一行中显示两个数字。
section .data
four: dw 0xdb,0x20,0x20,0xdb,0x0A,0xdb,0x20,0x20,0xdb,0x0A,0xdb,0xdb,0xdb,0xdb,0x0A,0x20,0x20,0x20,0xdb,0x0A,0x20,0x20,0x20,0xdb ; 4 in ASCII-Signs
fourlen equ $-four
section .bss
a1 resw 200 ;space to store the ASCII-Matrix-Numbers
section .text
global _start
_start:
mov eax,four
mov [a1],eax ;first 4 in a1
mov [a1+fourlen],eax ;second four in a1
mov eax,4
mov ebx,1
mov ecx,[a1] ;display 44 -> fail
mov edx,200
int 80h
end:
mov eax,1
mov ebx,0
int 80h
我想将每个ASCII号码存储在a1
中,以便能够在一行中显示ASCII号码。但那失败了。任何帮助/提示,以实现这一点?
答案 0 :(得分:1)
您保留200字的缓冲区,因此我认为您有意将整个数据块从four
复制到a1
。在汇编中,这不是由单个mov
完成的。
您的说明将引用four
的两个指针复制到a1
中:
mov eax,four
mov [a1],eax ; first 4 in a1
mov [a1+fourlen],eax ; second four in a1
相反,您应该将four
的内容复制到a1
:
cld
mov edi,a1 ; destination address
mov esi,four ; source address
mov ecx,fourlen ; number of bytes
rep movsb ; copy data from source to destination, first time
; do NOT adjust edi; it's already at the right address!
mov esi,four ; same source address
mov ecx,fourlen ; number of bytes
rep movsb ; copy data from source to destination, second time
与此一致,您应该将 sys_write (即您的第一个int 80h
)指向a1
,而不是指向最初存储在{{{}的两个指针中的第一个指针。 1}}。所以而不是:
a1
这样做:
mov ecx,[a1]
补充说明:
mov ecx,a1
替换为mov edx,200
。mov edx,2*fourlen
添加一个尾随0x0A
。或者最好两个four
s,以保持两个数字之间的一些空间。如果你想让两个四肢在同一条线上,那么你必须在0x0A
附加一些ANSI转义码才能将光标向上移动4行,以补偿four
中的4个换行符。如果您不想使用转义码,则必须重构代码,以便将所有数字逐行写入。four
浪费了内存,并且在那里复制数据会浪费CPU时间。您也可以直接从a1
使用两个单独的打印调用。您是否真的想要这样做取决于您对我之前的评论的选择。