利用中断16实现在屏幕上显示输入的字符
assume cs:code,ds:datadata segment
yan db 4,2,1
data ends
code segment
start:
mov ax,0b800h
mov ds,ax
mov bx,160*12+110*2
mov cx,3
kai:
sti
int 16h ;中断16h 放在循环中不能被执行,而是跳过去了,在循坏外可以正常执行
mov ds:,al
mov si,0
mov dl,yan ; 定的值不对 我的值储存在 1ca4:0010中 并没有占用1ca4:0的位置 ,可能是yan标志造成的,定的值 所有的段寄存器加 偏移0
都没有这个值
mov byte ptr ds:,0
add bx,4
inc si
loop kai
mov ax,4c00h
int 21h
code ends
end start
问题一: 为什么int16中断在循环中就不能用了
问题二: 储存资料的区域是不是在前面加标号,它的前16个字节就会被空出来
问题三: 直接定址表这个方法我用的是不是有问题,定的值在debug中显示 是从[ si+0000 ] 中得出的,但是我把所有的寄存起放在这个取值框的前面当段地址都没有这个值,它是从哪里来的
问题四: 我该怎么改才正确尼!!!!!
跪求 大神 给解释 自问自答啦!!!!
第一个问题 :因为我在int16号中断前没有将 ah 功能号 设置为 0
第二个问题:标号不会影响data的排位,代码区跟资料区一般都会 间隔 100,100是十六进制数
第三个问题:现在还不清楚,不知道编译器是从哪里抠出来的值
第四个问题: 我现在已经正常实现我要的功能了 附上代码
assume cs:code,ds:data
data segment
yan db 4,2,1
data ends
code segment
start:
mov ax,0b800h
mov ds,ax
mov bx,160*12+110*2
mov ax,data
mov es,ax
mov si,0
mov cx,3
kai:
mov ah,0
sti
int 16h ;中断16h 放在循环中不能被执行,而是跳过去了,在循坏外可以正常执行
mov ds:,al
mov dl,es: ; 定的值不对 我的值储存在 1ca4:0010中 并没有占用1ca4:0的位置 ,可能是yan标志造成的,定的值 所有的段寄存器加 偏移0
mov byte ptr ds:,dl
mov byte ptr ds:,0
add bx,4
inc si
loop kai
mov ax,4c00h
int 21h
code ends
end start
页:
[1]