用12666字符显示在 第8行3列 白底绿色
初次代码 编译卡在光标处 求指错 前3个实验都是卡在光标处 不知是否有联系
assume cs:code
data segment
db 10 dup (0)
data ends
code segment
start:
mov dh,8
mov dl,3
mov cl,2 ; 3 lines 参数
call show_str
mov cx,0
mov di,0
mov ax,12666
mov bx,data
mov ds,bx
mov bl,10
mov si,0 ;初始化寄存器
call s
mov ax,4c00h
int 21h
show_str: ;子程序1
mov al,160
mul dh
mov bx,ax
mov al,2
mul dl
add ax,bx
mov di,ax ;设置显存位置到di
mov ax,0b800h
mov es,ax
mov ax,data
mov ss,ax
mov sp,16
push cx ;保护现场
ret
s: ;子程序2
pop cx
div bl
mov cl,ah ;ah 存余数,为零就结束循环
mov ch,0
jcxz ok
mov ds:[si],ah ;余数存入ds段中
inc si
inc cx
push cx ;记录循环次数
jmp short s
;假设cx = 5
ok: ;子程序3 显示到显存
mov si,cx ;si=5
mov ax,0
mov al,[si-1]
mov ah,02h
sub si
mov es:[di],ax
add di,2
loop ok
ret
code ends
end start
------解决方案--------------------
mov?ax,data
??????mov?ss,ax
??????mov?sp,16
??????push?cx??????????????????;保护现场
??????ret
1.data段定义了10字节,?(mov?sp,16) 这条指令执行后,你不觉得有问题么?
2.
=================
??????push?cx??????????????????;保护现场
??????ret
ret 指令建议你看看, 估计你在这指令 执行后,就出错了。 push cx 执行后,sp指向的数据为 cx中的数据 了,你再执行ret指令,能返回正确 的地址 才怪。
=================
(我没调试过你的代码,我认为 主要的问题出在 ?第2个问题上。 第一个问题,出于 段的默认选项(PARA:使用下一个可能节地址),倒不一定会出错。 最好的办法 还是自己 单步 跟踪,随时 查看 堆栈区,数据区,IP等,总能发出 出错的原因的。)