我有一个任务,要编写一个英特尔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
字符串
结束起始
1条答案
按热度按时间tvokkenx1#
字符串
这个地址计算是没有意义的!而且因为你存储颜色属性的BL寄存器是更宽的BX寄存器的一部分,你丢失了正确的颜色信息。为什么你甚至从BL检索颜色,而不是从一开始就把它保存在AH中?是因为整个程序是基于一个使用
int 10h
作为字符输出的现有版本吗?我和你一样确定:型
而这些正是人们在
int 10h
解决方案中所期望的。常规的80 x 25文本屏幕每行使用160个字节。您希望金字塔的顶部位于第一行的中间,因此将地址寄存器初始化为80。稍后,为了向下移动一行,您将向此地址添加160个字节并再减去2个字节,因为每一级也会向左多一个字符。
一旦你把这些地址弄对了,就没什么大不了的了:
型
这次一定要理解代码,不要只是复制/粘贴,什么也学不到。