我不知道是否有人能帮助我,但我会尽可能清楚地解释我的问题。我正在用YASM学习8086 FPU。我想画 y = cos(x^2+x+1)This is how this graph looks like。我在DosBox中做这件事,我正在模拟8086处理器。
**我的问题:**如何规范化图形的(红色)比率,使其在DosBox中可读。
到目前为止,我设法画出了一个坐标平面。我想我设法画出了这个图,但是比例太小,无法检查它是否真的很好。这是它目前的样子GRAPH IMAGE ](https://i.stack.imgur.com/0Hy6X.jpg)。
我使用FPU来计算Y坐标。我使用堆栈来计算Y坐标。X坐标将从320变为0(十进制si),正如您在我的代码中所看到的。
在这段代码中,我试着用不同的X(si)来计算Y(di),并把像素放在它必须在的点上。
;------------------------------------------------------------------------
%include 'yasmmac.inc'
org 100h
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
section .text ; Code starts here
startas:
call procSetGraphicsMode
;;;;;;;;;;;;;;;;;;;;;;;;; COORDINATE PLANE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
mov di, 200
mov si, 160
.vertical:
mov cl, 15
call procPutPixel
dec di
jnz .vertical
mov si, 320
.horizontal:
mov di, 100
mov cl, 15 ; 15 = white color
call procPutPixel
dec si
jnz .horizontal
; y = di
; x = si
mov si, 320
mov di, 100
;;;;;;;;;;;;;;;;;;;;;;;; GRAPH ;;;;;;;;;;;;;;;;;;;;;;;;
.loop:
mov [value1], si
mov [value2], si
finit
fild dword [value1]
fild dword [value1]
fild dword [value3] ; move to stack 1
fmul dword [value1]
fadd st0, st1 ; add x in stack head
fadd st0, st3 ; add 1 in stack head
fcos ; cos(x^2 + x + 1)
frndint ; round
fistp word [y] ; Load rounded answer to [y] variable
add di, [y] ; Add [y] to di
mov cl, 4 ; 4 = Red color
call procPutPixel
dec si
jnz .loop
;;;;;;;;;;;;;;;;;;;;;;;; WAIT FOR ESC ;;;;;;;;;;;;;;;;;;;;;;;;
call procWaitForEsc
exit
%include 'yasmlib.asm'
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
section .data ; data
value1:
dd 0.0
value2:
dd 0.0
value3:
dd 1.0
xc:
dw 160
yc:
dw 100
x:
dw 0
y:
dw 0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
section .bss
yasmlib.asm如果有用的话
1条答案
按热度按时间j8ag8udp1#
轴是容易的部分
由于您正在使用分辨率为320 x 200的图形屏幕,因此X坐标的范围为0到319,Y坐标的范围为0到199。您的代码错误地输出X为320,Y为200,并且您没有使用X为0或Y为0。
数据定义
您的FPU指令正在处理存储在内存中的值,但处理方式不兼容!例如,* value 1 * 不能同时为整数双字和单精度浮点。您已使用16位整数寄存器SI中的值启动此变量,因此将其作为16位整数处理。
计算
finit
(最好使用非等待fninit
)最好保持在循环之外。frndint
是多余的,因为fistp word [y]
会自动为您进行舍入。fmul st0
可以对来自st 0的值求平方。fld1
可以将值1加载到FPU堆栈。不需要基于内存的变量,也不需要为每个X重新加载它。使输出可读
FPU提供的余弦值范围为-1到+1,但将此值存储在整数内存变量 y 中只会产生3个离散值-1、0和+1。
所需要的是将余弦缩放某个因子,比如说60。
将以下内容添加到数据中:
在省略号处添加
fimul word [scaleY]
,得到: