assembly 没有INT 10H的汇编器金字塔程序

yc0p9oo0  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(86)

我有一个任务,要编写一个英特尔8086汇编语言程序,在不使用INT 10h指令的情况下显示一个数字金字塔。
这是我当前的代码和result

Progr           segment
                assume  cs:Progr, ds:dane, ss:stosik
start:     
                mov     ax, dane
                mov     ds, ax
                mov     ax, stosik
                mov     ss, ax
                mov     ax, offset szczyt
                mov     sp, ax
                ; Clear screen
                mov     ax, 0B800h
                mov     es, ax
                xor     di, di
                mov     cx, 2000
                xor     ax, ax   
                rep     stosw
                mov     bl, 5
                mov     bh, 0
                mov     dh, 1
                mov     dl, 40
                mov     al, 65
                mov     cx, 1
                mov     di, 24
piramida:
                push    cx
wiersz:          mov     ah, bl
                 shl     bx, 1
                 add     bx, dx
                 shl     bx, 1
                 mov     es:[bx], ax
                 dec     cx          
                 jnz     wiersz       
                pop     cx
                inc     dh
                dec     dl
                inc     al
                add     cx,2
                inc     bl
                dec     di
                jnz     piramida
                mov     ah, 4Ch
                mov     al, 0
                int     21h
Progr           ends
dane            segment
dane            ends
stosik          segment
                dw    100h dup(0)
szczyt          Label word
stosik          ends

字符串
结束起始

tvokkenx

tvokkenx1#

wiersz: mov     ah, bl
        shl     bx, 1
        add     bx, dx
        shl     bx, 1
        mov     es:[bx], ax

字符串
这个地址计算是没有意义的!而且因为你存储颜色属性的BL寄存器是更宽的BX寄存器的一部分,你丢失了正确的颜色信息。为什么你甚至从BL检索颜色,而不是从一开始就把它保存在AH中?是因为整个程序是基于一个使用int 10h作为字符输出的现有版本吗?我和你一样确定:

mov     bl, 5     ; Color
mov     bh, 0     ; Page
mov     dh, 1     ; Row
mov     dl, 40    ; Column
...
inc     dh        ; Next row
dec     dl        ; 1 column more to the left
inc     al        ; Next ASCII
add     cx,2      ; Wider
inc     bl        ; Next color


而这些正是人们在int 10h解决方案中所期望的。

  • 这里重要的一课是,你必须首先理解一段代码在做什么**,然后才能修改**它 *。

常规的80 x 25文本屏幕每行使用160个字节。您希望金字塔的顶部位于第一行的中间,因此将地址寄存器初始化为80。稍后,为了向下移动一行,您将向此地址添加160个字节并再减去2个字节,因为每一级也会向左多一个字符。
一旦你把这些地址弄对了,就没什么大不了的了:

mov  dx, 0B800h
  mov  es, dx
  cld
  mov  cx, 1
  mov  bx, 80
  mov  ax, 0541h
Next:
  mov  di, bx
  push cx
  rep stosw
  pop  cx
  add  cx, 2
  add  bx, 160 - 2
  add  ax, 0101h    ; Next character and next color (SWAR-style)
  cmp  al, 'Y'      ; A to X are to be used
  jb   Next


这次一定要理解代码,不要只是复制/粘贴,什么也学不到。

相关问题