Assembly 使用NASM x86汇编绘制余弦波

Assembly 使用NASM x86汇编绘制余弦波,assembly,x86,nasm,x86-64,trigonometry,Assembly,X86,Nasm,X86 64,Trigonometry,我必须用汇编语言绘制一个简单的余弦(x)波。我已经按照教授的指示完成了项目的所有步骤,但我无法正确打印程序。这是我得到的输出 linux2[14]% cat plot4.out ***************************************** 但它应该是 ***** * * * *

我必须用汇编语言绘制一个简单的余弦(x)波。我已经按照教授的指示完成了项目的所有步骤,但我无法正确打印程序。这是我得到的输出

linux2[14]% cat plot4.out
*****************************************
但它应该是

                  *****                  
                 *     *                 
                *       *                
               *         *               
              *           *              
             *             *             

            *               *            
           *                 *           

          *                   *          

         *                     *         
        *                       *        

       *                         *       
      *                           *      
     *                             *     
    *                               *    
  **                                 **  
**                                     **
这是我的密码。任何协助都将不胜感激

      SECTION .data         ; Data section, initialized variables
nrow:           dq 21       ; 21 rows
ncol:           dq 41       ; 41 columns
fmtc:           db "%c", 0  ; print one character at a time
fmtend:         db 10, 0    ; end a line
star:           db '*'      ; one character '*'
fmtendLen:  equ $-fmtend
pStar:      db  "*"
starLen:    equ $-pStar
pSpace:     db  " "
spaceLen:   equ $-pSpace
len:            equ $-star
spc:            db ' '
af:         dq 1.0, 0.0, -0.5 ; coefficients of polynomial, a_0 first
            dq 0.0, 0.041667, 0.0, -0.001389, 0.0, 0.000025
XF:         dq 0.0      ; computed
Y:          dq 0.0      ; computed
N:          dq 8        ; power of polynomial
X0:         dq -3.14159     ; start XF
DX0:            dq 0.15708      ; increment for XF  ncol-1  times
one:            dq 1.0
ten:            dq 10.0
none:           dq -1.0
nten:           dq -10.0
twenty:         dq 20.0
zero:           dq 0.0
newline:    db 10

    section .bss

a2: resb    21*41       ; two dimensional array of bytes
i:  resq    1       ; row subscript
j:  resq    1       ; col subscript
k:  resq    1

    SECTION .text   ; Code section.

    global _start   ; the standard gcc entry point
_start:                     ; the program label for the entry point


;;;   clear a2 to space
    mov     rax,0           ; i=0
    mov     [i],rax

loopi:
    mov     rax,[i]
    mov     rbx,0       ; j=0
    mov     [j],rbx
loopj:
    mov     rax,[i]
    mov     rbx,[j]
    imul    rax,[ncol]  ; i*ncol
    add     rax, rbx    ; i*ncol + j
    mov     dl, [spc]   ; need just character, byte
    mov     [a2+rax],dl ; store space

    mov     rbx,[j]
    inc     rbx         ; j++
    mov     [j],rbx
    cmp     rbx,[ncol]  ; j<ncol
    jne     loopj

    mov     rax,[i]
    inc     rax         ; i++
    mov     [i],rax
    cmp     rax,[nrow]      ; i<ncol
    jne     loopi

;;;   end clear a2 to space

    mov     rax, 0          ;i = 0
    mov     [i], rax
    mov     rbx, 0          ;j = 0
    mov     [j], rbx

cos:
    mov     rcx,[N]         ; loop iteration count initialization, n
    fld     qword [af+8*rcx] ; accumulate value here, get coefficient a_
h5loop:
    fmul    qword [XF]  ; * XF
    fadd    qword [af+8*rcx-8] ; + aa_n-i
    loop    h5loop         ; decrement rcx, jump on non zero
    fstp    qword [Y]          ; store Y


;;; ; ;  compute k
    fld qword [Y]
    fadd qword [one]
    fmul qword [ten]
    fmul qword [none]
    fadd qword [twenty]
    fistp qword [k]

;;; ; ; ; ; rax gets k * ncol + j
    mov     rax, [k]
    mov     rbx, [j]
    imul    rax, [ncol]
    add     rax, rbx

;;; ; ; put "*" in dl, then dl into [a2+rax]
    mov     dl, [star]
    mov     [a2+rax], dl

;;; ; ; XF = XF + DX0
    fld     qword [XF]
    fadd    qword [DX0]
    fistp   qword [XF]


    mov     rbx, [j]
    inc     rbx         ; j++

    mov     [j], rbx
    cmp     rbx,[ncol]  ; j<ncol
    jne     cos

;;;   print
    mov     rax,0       ; i=0
    mov     [i],rax

ploopi:
    mov     rax,[i]
    mov     rbx,0       ; j=0
    mov     [j],rbx

ploopj:

    mov rax,[i]
    mov rbx,[j]
    mov dl, [spc]

    imul    rax,[ncol]
    add     rax, rbx


    mov     rax, [i]        ; a2+i*ncol+j  is byte
    imul    rax, [ncol]
    add     rax, [j]
    add     rax, a2
    mov     rsi, rax ; address of character to print
    mov     rax, 1       ; system call 1 is write
    mov     rdi, 1       ; file handle 1 is stdout
    mov rdx, 1       ; number of bytes
    syscall          ; invoke operating system to do the write

;;;  print here

    mov     rbx,[j]
    inc     rbx         ; j++
    mov     [j],rbx
    cmp     rbx,[ncol]  ; j<ncol
    jne     ploopj

    mov     rdi, fmtend
    mov     rax, 1
    mov     rdi, 1  ; file handle 1 is stdout
    mov     rsi, newline ; address of string to output
    mov     rdx, 1       ; number of bytes
    syscall

;;;  print here

    mov     rax,[i]
    inc     rax         ; i++
    mov     [i],rax
    cmp     rax,[nrow]      ; i<ncol
    jne     ploopi

;;;   print a2

    mov     eax, 60 ; system call 60 is exit
    xor     rdi, rdi    ; exit code 0
    syscall             ; invoke operating system to exit
SECTION.data;数据段,初始化变量
nrow:dq 21;21排
ncol:DQ41;41列
fmtc:db“%c”,0;一次打印一个字符
fmtend:db 10,0;结束一行
星号:db'*';一个字符'*'
fmtendLen:equ$-FMTENDLE
pStar:db“*”
starLen:equ$-pStar
pSpace:db“”
spaceLen:eq$-pSpace
len:equ$-star
spc:db''
af:dq1.0,0.0,-0.5;多项式的系数,a_0优先
dq 0.0,0.041667,0.0,-0.001389,0.0,0.000025
XF:dq0.0;计算
Y:dq0.0;计算
N:dq8;多项式的幂
X0:dq-3.14159;启动XF
DX0:dq0.15708;XF ncol-1的增量
一:dq1.0
十:DQ10.0
无:dq-1.0
nten:dq-10.0
20:dq 20.0
零:dq 0.0
换行代码:DB10
第2节bss
a2:resb21*41;二维字节数组
i:resq1;行下标
j:resq1;列下标
k:resq 1
第节.案文;代码部分。
全球启动;标准gcc入口点
_开始:;入口点的程序标签
;;;   清除a2到空间
mov-rax,0;i=0
mov[i],rax
loopi:
mov-rax[i]
mov-rbx,0;j=0
mov[j],rbx
loopj:
mov-rax[i]
mov rbx[j]
imul rax,[ncol];i*ncol
添加rax、rbx;i*ncol+j
mov-dl[spc];只需要字符,字节
mov[a2+rax],dl;存储空间
mov rbx[j]
加拿大皇家银行;j++
mov[j],rbx

cmp-rbx,[ncol];j代码无法按预期工作,因为
[XF]
更新错误:

fistp   qword [XF]  ; will store integer.
修复XF后,它将崩溃,因为计算的y值超出[0,0]->[41,21]坐标

通过在绘制星号之前添加最小/最大坐标钳制,您可以使代码更加健壮,因此,如果您的计算产生错误的[x,y],它将不会将星号写入某些内存,而是写入其他内容(我将y=0处的
'#'
放在那里,以查看图形哪里出错)

在此之后,您可能需要修复图形。。。这取决于你

无论如何,我对你们的装配技术还有一些评论(或者正如我在评论中所提到的,你们的讲师的技术)。我可以容忍这是学生的工作,但只能如此

要成为计算机程序员,你不应该把每一个愚蠢的行为逐字翻译成计算机命令。如果人们这样编程,排序在任何情况下都是满O(n^2),并且没有人会创建任何压缩算法。你应该从根本上理解你想要实现什么样的计算,并尽可能地简化

让我从你的代码中给你举个例子。初始部分是将空格字符放置到a2数组的每个位置。因此,它基本上是这样做的:

for (i = 0; i < 21; ++i)
  for (j = 0; j < 41; ++j)
    a2[i * ncol + j] = ' ';
它将用空格填充整个
a2
。如果这些循环按列进行,那么这段代码将按行进行不同的填充。但是,如果您只对计算结果感兴趣(整个数组设置为
'
),那么您就不关心它是按行、列还是圆进行的

等等,等等。。。代码中还有一些更奇怪的东西,但我不愿意完全按照我的口味重写,我希望这足以说明我的想法


顺便说一句,我不希望学生立即以
rep stosb
变体结束(甚至可以通过将
a2
填充为16或32倍大小,并用一些SSE指令或至少
stosd
来进一步优化性能)

但至少在每次迭代中识别内部循环是在做
i*ncol+j
。。。虽然您可以这样做:

for (i = 0; i < 21; ++i) {
  rowindex = i*ncol + 0;
  for (j = 0; j < 41; ++j) {
    a2[rowindex] = ' ';
    ++rowindex;
  }
}
现在您应该已经看到了两个
for
循环可以被单个
for(count=0;count<21*41;++count)
替换。。。但是等一下,这不等于charindex吗?哦,是的

for (i = 0; i < 21*41; ++i) a2[i] = ' ';

代码无法按预期工作,因为
[XF]
更新错误:

fistp   qword [XF]  ; will store integer.
修复XF后,它将崩溃,因为计算的y值超出[0,0]->[41,21]坐标

通过在绘制星号之前添加最小/最大坐标钳制,您可以使代码更加健壮,因此,如果您的计算产生错误的[x,y],它将不会将星号写入某些内存,而是写入其他内容(我将y=0处的
'#'
放在那里,以查看图形哪里出错)

在此之后,您可能需要修复图形。。。这取决于你

无论如何,我对你们的装配技术还有一些评论(或者正如我在评论中所提到的,你们的讲师的技术)。我可以容忍这是学生的工作,但只能如此

要成为计算机程序员,你不应该把每一个愚蠢的行为逐字翻译成计算机命令。如果人们这样编程,排序在任何情况下都是满O(n^2),并且没有人会创建任何压缩算法。你应该从根本上理解你想要实现什么样的计算,并尽可能地简化

让我从你的代码中给你举个例子。初始部分是将空格字符放置到a2数组的每个位置。因此,它基本上是这样做的:

for (i = 0; i < 21; ++i)
  for (j = 0; j < 41; ++j)
    a2[i * ncol + j] = ' ';
它将用空格填充整个
a2
。如果这些循环按列进行,那么这段代码将按行进行不同的填充。但是如果你只对计算结果感兴趣(wh
.......................*#################
.........................................
.........................................
.........................................
.........................................
*.....................*..................
.*.......................................
..*......................................
.........................................
...*.................*...................
.........................................
....*....................................
.....*..............*....................
.........................................
......*............*.....................
.......*.................................
........*.........*......................
.........*.......*.......................
..........*..............................
...........*...**........................
............***..........................