NASM - 大ASCII矩阵的数字

时间:2014-02-18 18:03:11

标签: assembly matrix ascii nasm

我想使用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号码。但那失败了。任何帮助/提示,​​以实现这一点?

1 个答案:

答案 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使用两个单独的打印调用。您是否真的想要这样做取决于您对我之前的评论的选择。
  • 您正在使用16位字来存储字符,如果您希望输出为UTF-16编码,则可以正常使用。我系统上的终端窗口需要UTF-8;那里需要进行一些调整。