assembly 如何在YASM 8086中绘制区间图

41ik7eoe  于 2022-12-13  发布在  其他
关注(0)|答案(1)|浏览(124)

我必须画一个图形y = cos(x2+x+1) interval: [-π/2,π/2]。我有一个没有间隔的图形,只是用屏幕分辨率320 x 200进行计算。

这是我目前的代码:

;------------------------------------------------------------------------
%include 'yasmmac.inc'  
org 100h                       

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
section .text                   ; code starts here
   startas:
      call procSetGraphicsMode

     xor  di, di     ; Y
   .vertical:
     mov  si, 160    ; X
     mov  cl, 15     ; Color
     call procPutPixel
     inc  di
     cmp  di, 199    ; MaxY
     jbe  .vertical

     xor  si, si     ; X
   .horizontal:        
     mov  di, 100    ; Y
     mov  cl, 15     ; Color
     call procPutPixel
     inc  si
     cmp  si, 319    ; MaxX
     jbe  .horizontal

  ; y = di
  ; x = si
  mov si, 320
  mov di, 100

      xor   si, si          ; X
    fninit
    fld1                  ; CONST 1
.loop:
    mov   [valueX], si    ; X
    fild  word [valueX]   ; st0 = X
    fmul  st0             ; st0 = X^2
    fiadd word [valueX]   ; st0 = X^2 + X
    fadd  st0, st1        ; st0 = X^2 + X + 1
    fcos                  ; st0 = cos(X^2 + X + 1)         [-1,+1]
    fimul word [scaleY]
    fistp word [y]        ; {-1,0,+1}
    mov   di, 100         ; Y
    add   di, [y]         ; -> Y={99,100,101}
    mov   cl, 4           ; Color
    call  procPutPixel
    inc   si
    cmp   si, 319
    jbe   .loop

   call procWaitForEsc 
  exit
      

%include 'yasmlib.asm'
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
section .data                   ; data
     R:
     dd  50.0

   value1: 
      dd  0.0
   value2:
      dd  0.0
   value3:
      dd 1.0

   valueX:  
      dw 0
   
   scaleY: 
       dw 60
          
     x: 
     dw  0
     y:
     dw 0
     
     N:
     dw 360  
     
  
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
section .bss

此代码段绘制一个坐标平面和图形,不在给定的间隔内[-π/2,π/2]. x1c 0d1x
我想让程序在区间[-π/2,π/2]内画出这个区间,看起来像这样:

我需要以某种方式缩放我的X,使图形将在区间内。
我想让X的起点在中心(160),但我无法想象,如何移动到两边(负-朝向-π/2和正-朝向π/2)。我试图解释清楚,我可以。
如果需要更多信息,我将尝试编辑问题。

xj3cbfub

xj3cbfub1#

图形y = cos(x2+x+1)
我现在糊涂了:你想画的是cos(x2 + x + 1)还是cos(x^2 + x + 1)link in your previous question(不是问题中的文本)和这个问题中的图片显示的是前者,但我当时和现在的答案是关于后者的。
x^2 + x + 1的一个例子是x2 + x + 1很快就会被写成3x + 1
我已经包括了一个图片,它将图形限制为一个矩形,该矩形的宽度为289像素,高度为181像素。
由于矩形位于屏幕中央,因此其X坐标的范围为16到304,Y坐标的范围为10到190。
因为X=0位于X轴的中间,所以物理范围[16,304]对应于逻辑范围[-144,+144]。您要求-144与-π/2对齐,+144与+π/2对齐。三法则可以帮助您:

144 .. (π/2)
  1 .. (π/2) / 144
  n .. (π/288) * n

因此,(π/288)将是应用于所有逻辑X的因子,你可以输入代码。

ORG   256             ; cos(X^2 + X + 1)

  mov   ax, 0013h       ; Set 320x200 256-color screen
  int   10h

  mov   dx, 100         ; Y
  mov   cx, 11          ; X
  mov   bh, 0           ; DisplayPage
X:
  mov   ax, 0C07h       ; BIOS.WritePixel White
  int   10h
  inc   cx              ; X++
  cmp   cx, 309
  jbe   X

  mov   dx, 5           ; Y
  mov   cx, 160         ; X
Y:
  mov   ax, 0C07h       ; BIOS.WritePixel White
  int   10h
  inc   dx              ; Y++
  cmp   dx, 195
  jbe   Y

  fninit
  fldpi
  fidiv word [DeltaX]   ; CONST (π/288)
  fld1                  ; CONST 1
  mov   si, -144        ; LogicalX
work:
  mov   [Temp], si
  fild  word [Temp]     ; st0 = LogicalX
  fmul  st2             ; st0 = LogicalX * (π/288) = X        [-π/2,+π/2]
  fld1                  ; st1 = X, st0 = 1
  fadd  st1             ; st1 = X, st0 = X + 1
  fmulp                 ; st0 = X * (X + 1) = X^2 + X
  fadd  st1             ; st0 = X^2 + X + 1
  fcos                  ; st0 = cos(X^2 + X + 1)              [-1,+1]
  fimul word [ScaleY]   ; st0 = cos(X^2 + X + 1) * 90         [-90,+90]
  fistp word [Temp]
  mov   dx, 100         ; Position of the X-axis
  sub   dx, [Temp]      ; DX is PhysicalY
  lea   cx, [si+160]    ; CX is PhysicalX
  mov   ax, 0C0Fh       ; BIOS.WritePixel BrightWhite
  int   10h

  mov   [Temp], si
  fild  word [Temp]     ; st0 = LogicalX
  fmul  st2             ; st0 = LogicalX * (π/288) = X        [-π/2,+π/2]
  fcos                  ; st0 = cos(X^2 + X + 1)              [-1,+1]
  fimul word [ScaleY]   ; st0 = cos(X^2 + X + 1) * 90         [-90,+90]
  fistp word [Temp]
  mov   dx, 100         ; Position of the X-axis
  sub   dx, [Temp]      ; DX is PhysicalY
  lea   cx, [si+160]    ; CX is PhysicalX
  mov   ax, 0C0Eh       ; BIOS.WritePixel Yellow
  int   10h

  inc   si
  cmp   si, 144
  jle   work
  fninit                ; Remove constants

  mov   ah, 00h
  int   16h
  mov   ax, 0003h
  int   10h
  ret
; ----------------------
DeltaX: dw 288
ScaleY: dw 90
Temp:   dw 0

为了便于验证,我添加了黄色的余弦图,这是我多年来在处理图形形状不明显的表达式时学到的技巧。

相关问题