- [游客] 1 09/06 14:08
- [游客] www.oasvc.cn 08/25 22:34
- [游客] 【钱龙】民族证券钱龙金典版 <a href="http://www.yfcj.com.cn/htm 05/03 13:39
- [游客] [url=http://www.ntshop.cn/gzsb/index.htm]化工干燥[/url 04/06 08:14
- [游客] [url=http://www.ntshop.cn/smzp/hrq.htm]石墨换热器[/url] 04/05 20:44
- [next_soul] 不用软盘可不可以啊不好找这东西啊 08/22 14:04
- [qingpengchen2011] 呃~好吧~我认真的看了一下~没有错,你的地址都有重新计算过 08/04 23:08
- [qingpengchen2011] 你有编译么? 测试通过么? 我看了一下,你可能有一些错误的 08/04 23:00
- [linzy] 扫描码28的是顿号,扫描码是33的是逗号。 04/12 15:44
- [a88510] 有个问题....你学的是王爽的8086汇编吧?那个自己动手写操作系统的用的也是16位汇编??不是32 04/09 14:13
- [游客] 汇编语言论坛上的的图片加载不出来怎么处理 06/13 19:37
- 第四章:no stack segment 警告的完整解决方案(带图片)
- 第15章:扫描码勘误
- 第17章 课程设计2对教材上系统的启动过程材料进行补充
- 第17章:完整的接收字符串输入的程序(带注释,图片)
- 王爽《汇编语言》第2版第16章:计算sin(x) (带图片,带角度检测)
- 王爽《汇编语言》第2版第15章外中断的实验如何才能看到实验效果?已解决!
- 王爽《汇编语言》第2版274页表15.1列出了键盘上部分键的扫描码有问题?
- 王爽《汇编语言》第2版实验14:访问CMOS RAM显示当前日期和时间 (带图片)
- 王爽《汇编语言》第2版实验13(3)在屏幕2,4,6,8行显示4句英文诗
- 王爽《汇编语言》第2版实验13(1)用int 7ch中断显示用0结束的字符串
[2011-02-11 08:09] 第17章:字符串的输入
assume cs:code
code segment
start:
call getstr
mov ax,4c00h
int 21h
;完整的接收字符串输入的子程序
;21:03 2011-02-10 author:chinaljg
getstr: push ax
getstrs: mov ah,0
int 16h ;读取键盘缓冲区,ah=扫描码al=ascii码
cmp al,20h
jb nochar ;ascii码小于20h,说明不是字符
;ascii码小于41h,能否说明不是字符?????????????????
mov ah,0 ;ah=0,表示0号功能入栈,要入栈的字符在al中
call charstack ;字符入栈
mov ah,2
call charstack ; 显示栈中的字符
jmp getstrs
nochar: cmp ah,0eh ;ah放扫描码al放ascii码,退格键的扫描码0eh
je backspace
cmp ah,1ch ;enter键的扫描码1ch
je enter
jmp getstrs
backspace:
mov ah,1
call charstack ;字符出栈
mov ah,2
call charstack ;显示栈中的字符
jmp getstrs
enter: mov al,0 ;(al)=0入栈作为字符串的结束符
mov ah,0 ;(ah)=0调用0号子功能
call charstack ;0入栈
mov ah,2
call charstack ;显示栈中的字符
pop ax
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;子程序:字符栈的入栈 出栈 显示
;参数说明:(ah)=功能号,0表示入栈,1表示出栈,2表示显示
;ds:si指向字符栈空间
;对于0号功能:(al)=入栈字符
;对于1号功能:(al)=返回的字符
;对于2号功能:(dh) (dl)=字符串在屏幕上显示的行列位置
charstack: jmp short charstart
table dw charpush,charpop,charshow
top dw 0 ;栈顶,或栈内元素数量(top)=0表示栈空,(top)=2表示栈内有2个元素。
charstart: push bx
push dx
push di
push es
cmp ah,2 ;判断子程序的功能号
ja sret ;大于2返回
mov bl,ah ;通过bx计算功能号在table中的偏移地址
mov bh,0
add bx,bx ;一个偏移地址占2个字节,所以bx*2
jmp word ptr table[bx] ;跳转到子程序的相应功能:入栈 出栈 显示
;call word ptr table[bx]?
charpush: mov bx,top ;bx指向栈顶
mov [si][bx],al ;将al内的字符入栈
inc top ;栈顶上移一个字节
jmp sret ;返回
charpop: cmp top,0 ;出栈前判断字符栈是否为空
je sret ;字符栈为空,不用出栈,直接返回
dec top ;字符栈不空,栈指针top下移指向栈顶元素.top=0时,0不是栈顶元素,而是下一个要入栈的元素存放的位置
mov bx,top ;bx指向栈顶元素
mov al,[si][bx] ;(al)=返回的栈顶元素
jmp sret ;返回
charshow: mov bx,0b800h
mov es,bx ;es指向显存缓冲区
mov al,160
mov ah,0
mul dh ;计算行数160*dh,结果在ax中
mov di,ax ;保存到di中,es:[di]指向显示的位置
add dl,dl ;计算列数 dl*2
mov dh,0
add di,dx ;计算出字符要显示的位置:160*ah+al*2
mov bx,0 ;bx用来表示字符在字符栈中的偏移量,bx=0时表示指向字符栈中的第一个字符(从0开始)
;也可以理解为bx指向栈底元素
charshows:
cmp bx,top ;栈底和栈顶比较,用来判断字符栈是否为空,栈底=栈顶,栈空.
jne noempty
mov byte ptr es:[di],' ' ;栈空,显示空格相当于无任何显示.清除屏幕上上一次显示的内容
jmp sret ;返回
noempty: mov al,[si][bx] ;栈不空,(al)=栈底元素
mov es:[di],al ;将(al)显示
mov byte ptr es:[di+2],' ' ;?把下一个要显示字符的位置清空?清除屏幕上上一次显示的内容
inc bx ;(bx)指向下一个栈底元素,栈底上移
add di,2 ;ds:[di]指向下一个显示位置
jmp charshows ;继续显示,直到栈空.
sret: pop es
pop di
pop dx
pop bx
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
code ends
end start
;;;;;;;;;;向大家学习,QQ:1250609960;;;;;;;
code segment
start:
call getstr
mov ax,4c00h
int 21h
;完整的接收字符串输入的子程序
;21:03 2011-02-10 author:chinaljg
getstr: push ax
getstrs: mov ah,0
int 16h ;读取键盘缓冲区,ah=扫描码al=ascii码
cmp al,20h
jb nochar ;ascii码小于20h,说明不是字符
;ascii码小于41h,能否说明不是字符?????????????????
mov ah,0 ;ah=0,表示0号功能入栈,要入栈的字符在al中
call charstack ;字符入栈
mov ah,2
call charstack ; 显示栈中的字符
jmp getstrs
nochar: cmp ah,0eh ;ah放扫描码al放ascii码,退格键的扫描码0eh
je backspace
cmp ah,1ch ;enter键的扫描码1ch
je enter
jmp getstrs
backspace:
mov ah,1
call charstack ;字符出栈
mov ah,2
call charstack ;显示栈中的字符
jmp getstrs
enter: mov al,0 ;(al)=0入栈作为字符串的结束符
mov ah,0 ;(ah)=0调用0号子功能
call charstack ;0入栈
mov ah,2
call charstack ;显示栈中的字符
pop ax
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;子程序:字符栈的入栈 出栈 显示
;参数说明:(ah)=功能号,0表示入栈,1表示出栈,2表示显示
;ds:si指向字符栈空间
;对于0号功能:(al)=入栈字符
;对于1号功能:(al)=返回的字符
;对于2号功能:(dh) (dl)=字符串在屏幕上显示的行列位置
charstack: jmp short charstart
table dw charpush,charpop,charshow
top dw 0 ;栈顶,或栈内元素数量(top)=0表示栈空,(top)=2表示栈内有2个元素。
charstart: push bx
push dx
push di
push es
cmp ah,2 ;判断子程序的功能号
ja sret ;大于2返回
mov bl,ah ;通过bx计算功能号在table中的偏移地址
mov bh,0
add bx,bx ;一个偏移地址占2个字节,所以bx*2
jmp word ptr table[bx] ;跳转到子程序的相应功能:入栈 出栈 显示
;call word ptr table[bx]?
charpush: mov bx,top ;bx指向栈顶
mov [si][bx],al ;将al内的字符入栈
inc top ;栈顶上移一个字节
jmp sret ;返回
charpop: cmp top,0 ;出栈前判断字符栈是否为空
je sret ;字符栈为空,不用出栈,直接返回
dec top ;字符栈不空,栈指针top下移指向栈顶元素.top=0时,0不是栈顶元素,而是下一个要入栈的元素存放的位置
mov bx,top ;bx指向栈顶元素
mov al,[si][bx] ;(al)=返回的栈顶元素
jmp sret ;返回
charshow: mov bx,0b800h
mov es,bx ;es指向显存缓冲区
mov al,160
mov ah,0
mul dh ;计算行数160*dh,结果在ax中
mov di,ax ;保存到di中,es:[di]指向显示的位置
add dl,dl ;计算列数 dl*2
mov dh,0
add di,dx ;计算出字符要显示的位置:160*ah+al*2
mov bx,0 ;bx用来表示字符在字符栈中的偏移量,bx=0时表示指向字符栈中的第一个字符(从0开始)
;也可以理解为bx指向栈底元素
charshows:
cmp bx,top ;栈底和栈顶比较,用来判断字符栈是否为空,栈底=栈顶,栈空.
jne noempty
mov byte ptr es:[di],' ' ;栈空,显示空格相当于无任何显示.清除屏幕上上一次显示的内容
jmp sret ;返回
noempty: mov al,[si][bx] ;栈不空,(al)=栈底元素
mov es:[di],al ;将(al)显示
mov byte ptr es:[di+2],' ' ;?把下一个要显示字符的位置清空?清除屏幕上上一次显示的内容
inc bx ;(bx)指向下一个栈底元素,栈底上移
add di,2 ;ds:[di]指向下一个显示位置
jmp charshows ;继续显示,直到栈空.
sret: pop es
pop di
pop dx
pop bx
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
code ends
end start
;;;;;;;;;;向大家学习,QQ:1250609960;;;;;;;
评论次数(1) |
浏览次数(1051) |
类型(汇编作业) |
收藏此文 |