- [游客] 表示每次运行到cx=2的时候就不能再往下一步进行了! 谁能告诉我是哪里的问题? 06/11 23:38
- [游客] 这是C下的么?main中的 int c[]={6,7,8,9} ; int *p = c; 08/06 15:33
- [游客] 实现队列?呵呵,以前学C的时候也弄过队,循环队列等东西,锻炼了很多思维逻辑上的东西。 博主可以自己 08/06 15:30
- [maxm] 这实验没难度,关键是细心 几个易出错的地儿我都在注释中做了标记 希望大家别跟我一样犯糊涂 (*^ 06/04 20:58
- [maxm] 感谢fangyugirl分享心得 05/08 18:47
- [fangyugirl] 看到你说你在这章徘徊了两周,我跟你差不多的。我是做BIOS的,上班时没有事情了就看书,做课程设计一时 04/23 13:44
- [maxm] 哎,没有自己电脑。 03/19 20:57
- [游客] 然后继续编程 呵呵 03/18 20:56
- [游客] 我被卡在这一章了,就因为这个实验。 03/18 15:31
- [maxm] 最后加了点注释,程序改动如下: ;------------------------------ 03/13 15:52
[2009-06-04 20:53] 实验11 细心就成
assume cs:codesg
datasg segment
db "Binginner's All-purpose Sysmbolic Instruction Code.",0
datasg ends
codesg segment
start:
mov ax,datasg
mov ds,ax
mov si,0
mov dh,5
mov dl,5
mov cl,11111001b ;白底高亮闪烁蓝字
call cls ;清屏
call show_str ;原始字串
call letterc
mov dh,7
mov dl,5
mov cl,11111001b
call show_str ;转换后
mov ax,4c00h
int 21h
;名称:letterc
;功能:将以 0 结尾的字符串中的所有小写字母转换成大写的
;参数:ds:si 指向字符串首地址
letterc:
push si
push cx
do:
mov ch,0
mov cl,ds:[si]
jcxz exit
cmp cl,97 ;97是小写 a
jb next
cmp cl,122
ja next
and cl,11011111b ;小写转大写,注意不要将 and 写成 add
mov byte ptr ds:[si],cl ;这句一定不能忘记,要不然白转换了
next:
inc si
jmp short do ;注意不要写成 jmp short ptr do
exit:
pop cx
pop si
ret
;名称:show_str
;功能:在指定的位置用指定的颜色,显示一个用0结束的字符串
;参数:(dh) = 行号(0~24),(dl) = 列号(0~79)
; (cl) = 颜色,ds:si指向字符串的首地址
;返回:无
show_str:
push ax
push es
push dx
push bx
push cx
push di
push si
mov ax,0b800h
mov es,ax
mov al,160
mul dh
mov bx,ax
mov al,2
mul dl
add bx,ax
mov dl,cl ;dl暂存颜色属性
mov ch,0
mov di,0
show: ;显示
mov cl,ds:[si]
jcxz ok
mov byte ptr es:[bx+di],cl ;偶地址字符
mov byte ptr es:[bx+di+1],dl ;奇地址属性
inc si
add di,2
jmp short show
ok:
pop si
pop di
pop cx
pop bx
pop dx
pop es
pop ax
ret
;清屏子程序
cls:
push ax
push es
push di
push cx
mov ax,0b800h
mov es,ax
mov di,0
mov cx,2000 ;循环2000次
go:
mov byte ptr es:[di+1],00h ;00h即黑底黑字
add di,2
loop go
pop cx
pop di
pop es
pop ax
ret
codesg ends
end start
datasg segment
db "Binginner's All-purpose Sysmbolic Instruction Code.",0
datasg ends
codesg segment
start:
mov ax,datasg
mov ds,ax
mov si,0
mov dh,5
mov dl,5
mov cl,11111001b ;白底高亮闪烁蓝字
call cls ;清屏
call show_str ;原始字串
call letterc
mov dh,7
mov dl,5
mov cl,11111001b
call show_str ;转换后
mov ax,4c00h
int 21h
;名称:letterc
;功能:将以 0 结尾的字符串中的所有小写字母转换成大写的
;参数:ds:si 指向字符串首地址
letterc:
push si
push cx
do:
mov ch,0
mov cl,ds:[si]
jcxz exit
cmp cl,97 ;97是小写 a
jb next
cmp cl,122
ja next
and cl,11011111b ;小写转大写,注意不要将 and 写成 add
mov byte ptr ds:[si],cl ;这句一定不能忘记,要不然白转换了
next:
inc si
jmp short do ;注意不要写成 jmp short ptr do
exit:
pop cx
pop si
ret
;名称:show_str
;功能:在指定的位置用指定的颜色,显示一个用0结束的字符串
;参数:(dh) = 行号(0~24),(dl) = 列号(0~79)
; (cl) = 颜色,ds:si指向字符串的首地址
;返回:无
show_str:
push ax
push es
push dx
push bx
push cx
push di
push si
mov ax,0b800h
mov es,ax
mov al,160
mul dh
mov bx,ax
mov al,2
mul dl
add bx,ax
mov dl,cl ;dl暂存颜色属性
mov ch,0
mov di,0
show: ;显示
mov cl,ds:[si]
jcxz ok
mov byte ptr es:[bx+di],cl ;偶地址字符
mov byte ptr es:[bx+di+1],dl ;奇地址属性
inc si
add di,2
jmp short show
ok:
pop si
pop di
pop cx
pop bx
pop dx
pop es
pop ax
ret
;清屏子程序
cls:
push ax
push es
push di
push cx
mov ax,0b800h
mov es,ax
mov di,0
mov cx,2000 ;循环2000次
go:
mov byte ptr es:[di+1],00h ;00h即黑底黑字
add di,2
loop go
pop cx
pop di
pop es
pop ax
ret
codesg ends
end start
评论次数(1) |
浏览次数(1003) |
类型(实验) |
收藏此文 |
[ maxm 发表于 2009-06-04 20:58 ]
这实验没难度,关键是细心
几个易出错的地儿我都在注释中做了标记
希望大家别跟我一样犯糊涂 (*^__^*)
当然这个清屏子程序是有问题的,因为命令行的背景色不一定是黑色 (*^__^*)