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