cenjie88 发表于 2011-10-11 11:46:26

改动过的实验11

本帖最后由 cenjie88 于 2011-10-11 12:01 编辑

assume cs:codesg
datasg segment
db "Beginner's ALL-purpose Synbolic Instructin Code.",0
datasg ends
codesg segment
begin:mov ax,datasg
      mov ds,ax
   mov si,0
   
   call letterc
   
   mov ax,4c00h
   int 21h
   
letterc:push si
      push ax
push di
mov ax,0b800h          ;显存首地址
mov es,ax

   s0:mov al,ds:
      cmp al,0                ;cmp 判断索引地址是否为0
je s                  ;结果等于0则跳转
cmp al,41h            ;cmp 判断字符是否小写(大写字母asscma对应16进制41-7a)
jb s1                   ;小于对应字符进行跳转
cmp al,7ah            ;cmp 字符是否是小写
ja s1                   ;大于对应字符进行跳转
and al,11011111b
s1:mov ah,01110100b      ;显示白底蓝字
   mov es:330h,ax      ;显存偏移地址
   inc si                  ;指向下一个字符
add di,2                ;指向下一个显存地址
jmp short s0            ;跳转索引原字符

s: pop di
   pop ax
pop si
   ret
codesg ends
end begin
实验11并以白底蓝字显示出来

这个是可以正常显示,但显存偏移330H这里要是改成331、333、335奇数尾时就会显示错误。
关闭再打开就不能正常显示。请高手指点



cenjie88 发表于 2011-10-11 11:48:11

本帖最后由 cenjie88 于 2011-10-11 12:02 编辑

请大虾指点

小甲鱼 发表于 2011-10-11 20:28:50

显存的奇数地址存放的是对应的属性哦~

cenjie88 发表于 2011-10-11 22:14:53

嗯,谢谢甲鱼老师。不过关闭再打开显示不正常应该和那个是不是叫什么dos来的有关吧。

三田学校 发表于 2012-7-28 15:26:16

我的代码如下:
assume cs:code,ds:data

data segment
db "Beginner's All-purpose Symbolic Instruction Code.",0
data ends
code segment
start:
mov ax,data
mov ds,ax

mov ax,0b878h
mov es,ax

mov si,0
mov di,0

call letterc
mov ax,4c00h
int 21h
letterc:
mov al,
cmp al,0
je exit
cmp al,'a'
jb s0
cmp al,'z'
ja s0
and al,11011111b
mov byte ptr ,al
s0:
;显示白底黑字
mov byte ptr es:,al
mov byte ptr es:1,01110000b
inc si
add di,2
jmp short letterc
exit:
ret
code ends
end start


页: [1]
查看完整版本: 改动过的实验11