一个有趣的现象,入栈了不会出栈!!!
一下程序,希望个位指教,有详细注释!!!程序就是把data中的数据在显存8行3列用绿色显示,遇到0就退出。;小疑问:程序中没有使用栈,但是没有错误,难道内存自动定义一个栈?
;在s2下面还有一个小错误。。。整个程序还存在两个警告!!!
assume cs:code
data segment
db 'Welcome to masm!',0
data ends
;stack segment ;原代码中没有定义栈
; db 16 dup (0)
;stack ends
code segment
start: mov dh,8 ;显存的行
mov dl,3 ;显存的列
mov cl,2 ;颜色
mov ax,data
mov ds,ax
;mov ax,stack ;原代码中没有定义栈
;mov ss,ax
;mov sp,16
mov si,0
mov bx,0 ;自己加的寄存器,貌似原代码没有bx
call show ;跳转指令
mov ax,4c00h ;返回指令
int 21h
show:
mov ax,0B800h ;显存段地址
mov es,ax
mov al,160 ;每行160个字节
mul dh ;8位运算,储存在ax中
mov bx,ax ;寄存相乘后的结果,作为es的偏移地址使用
add bx,160 ;加160是因为显示器貌似不是从第一行开始显示的
s2: push cl ;cl入栈是为了保存颜色
mov ch,0 ;让ch赋值为0
mov cl,ds:[si] ;把数据段中的字节赋值到cl中
jcxz s1 ;cx不为0,则继续向下运行,否则跳转到s1
mov es:[bx + 4],cl ;把cl赋值到显存
pop cl ;将保存的颜色出栈,准备使用 (但是貌似没有出栈,运行后的颜色各不相同)
mov ch,cl; mov ch,2; ;颜色保存到ch中(想不通为什么这里写mov ch,2就是对的,这样写就是错的。。。)
mov es:[bx + 5],ch ;ch赋值给高位(高位保存颜色,低位保存字节)
inc si
add bx,2
loop s2 ;s2循环
s1: ret ;跳到返回指令处
code ends
end start