|
主题 : : 实验11答案完整版 [待解决] |
回复[ 13次 ]
点击[ 809次 ] | |
|
|
|
|
[帖 主]
[ 发表时间:2011-09-15 08:12 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2011-09-01 07:12 |
;编写一个子程序,将包含任意字符,以〇结尾的字符串中的小写字母转变成大写字母
;参数:ds:si指向字符串首地址
;子调用程序的设计如下:
;s循环:判断字符是否为0,是0则停止,非0则跳转到p0处判断大小
;p0:判断x是否>=61H,是则跳转到p1处再判断,不是则跳出判断读取下一个数据x
;p1:判断x是否<=7aH,是则跳转到t0处开始转换,不是则跳出判断取下一个数据x
;s循环结束
;t0:因为小写字母的a码比大写的a码大20H,故x的值-20H,结果存入栈中,最后一个数
; 入一个0进栈,为以后显示打基础。
assume cs:code
data segment
db "Beginner's All-purpose Symbolic Instruction Code.",0
data ends
stack segment
dw 80 dup (0)
stack ends
code segment
start:
mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
mov sp,0a0h
mov si,0
call letter
mov dh,21 ;行号
mov dl,1 ;列号
call show
mov ax,4c00h
int 21h
letter:
mov ch,0
mov cl,ds:[si]
jcxz ok
mov al,ds:[si]
cmp al,61H
jnb p1
inc si
jmp short letter
p1:
cmp al,7aH
jna t0
inc si
jmp short letter
t0:sub al,20H
mov ds:[si],al
inc si
jmp short letter
ok:
ret
;****************show part*********************
show:
mov ax,0a0h ;算出行
mul dh
mov bx,ax
mov ax,2h ;算出列
mul dl
mov di,ax
mov si,0
mov ax,0b800h
mov es,ax
change:mov cl,ds:[si]
mov ch,0
jcxz ok1 ;判断0结束字符
push ds:[si] ;把字符串放入栈中
pop es:[bx].[di] ;从栈中取出字符放入显示区的偶地址中
mov ax,2 ;绿色属性
mov es:[bx].[di].1,ax ;颜色字符放入奇地址中
add di,2
inc si
jmp short change
ok1:
ret
;**********************************************
code ends
end start | | |
|
|
|
|
[第1楼]
[ 回复时间:2011-11-24 17:58 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2011-11-15 22:48 |
|
|
|
|
|
[第2楼]
[ 回复时间:2011-11-24 20:54 ]
[引用]
[回复]
[ top ] | |
荣誉值:405
信誉值:0
注册日期:2008-01-19 14:51 |
楼主是显示出来了。这道题好像不用显示出来,在debug下查看就可以了。 | | |
|
|
|
|
[第3楼]
[ 回复时间:2011-11-25 05:45 ]
[引用]
[回复]
[ top ] | |
荣誉值:118
信誉值:0
注册日期:2011-07-07 22:59 |
回复:[第1楼]
-------------嫌麻烦?那你看书做什么?看书不麻烦吗?还得翻还得想,那你为什么要看书?人活着做什么?每天都有那么多鸡毛蒜皮的事,多麻烦呀。你回复之前怎么不问下你自己怎么好意思说出口了。 | | |
|
|
|
|
[第4楼]
[ 回复时间:2011-11-25 13:11 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2011-11-15 22:48 |
你是不是有精神系统的疾病呀,我只是说这个程序没必要写这么多代码,可以使其更简单,写代码不是只是写出来而已,要使其运算效率更高,更节省内存,注重代码质量,不懂别在这放屁,我只是提点建议,可能用词不太恰当,但我是好意。 | | |
|
|
|
|
[第5楼]
[ 回复时间:2011-11-25 17:31 ]
[引用]
[回复]
[ top ] | |
荣誉值:118
信誉值:0
注册日期:2011-07-07 22:59 |
哦,那这个程序应该写成什么样.才能做到更简单,运算效率更高,更节省内存?
要知道,精简的代码也是要付出代价的. | | |
|
|
|
|
[第6楼]
[ 回复时间:2011-12-15 18:09 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2011-12-15 17:59 |
在指定的位置,用指定的颜色,显示一个用0结尾的字符串,并把小写字母变为大写字母。请教 | | |
|
|
|
|
[第7楼]
[ 回复时间:2012-01-05 17:18 ]
[引用]
[回复]
[ top ] | |
荣誉值:6
信誉值:1
注册日期:2008-09-04 16:35 |
回复:[第4楼]
------------------
实验11答案完整版
LZ 标题是完整版。 精简了对不起标题呐。。。 | | |
|
|
|
|
[第8楼]
[ 回复时间:2012-01-21 23:04 ]
[引用]
[回复]
[ top ] | |
荣誉值:6
信誉值:1
注册日期:2008-09-04 16:35 |
;;;;;;;;;;;;;;;;;;;;;;;;;;;letterc子程序开始;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;功能:
;将以0结尾的字符串中的小写字母转变成大写字母
;参数:
;DS:SI指向字符串首地址
;返回: 无
letterc:
pushf
push ax
push cx
push si
letterc1:
mov ax,ds:[si]
mov cx,ax
jcxz letterc3
cmp ax,61d
jb letterc2
cmp ax,87d
ja letterc2
sub ax,20d
letterc2:
mov table[si],ax
inc si
jmp letterc1
letterc3:
pop si
pop cx
pop ax
pushf
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;letterc子程序结尾;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
留个印。
折腾人,加深了对offset的认识。(offset好像只适用于在CS段中的标号) | | |
|
|
|
|
[第9楼]
[ 回复时间:2012-01-21 23:10 ]
[引用]
[回复]
[ top ] | |
荣誉值:6
信誉值:1
注册日期:2008-09-04 16:35 |
letterc2:
mov table[si],ax
改:
MOV ES:[DI],AX | | |
|
|
|
|
[第10楼]
[ 回复时间:2012-05-07 20:00 ]
[引用]
[回复]
[ top ] | |
荣誉值:6
信誉值:2
注册日期:2010-12-02 13:35 |
小写转化成大写的子程序不够简洁,不如这样写:
letterc:mov ch,0
mov cl,[si]
jcxz ok
cmp cl,61h
jb next
cmp cl,7ah
ja next
and cl,11011111b
mov [si],cl
next: inc si
jmp short letterc
ok: ret | | |
|
|
|
|
[第11楼]
[ 回复时间:2012-05-07 20:01 ]
[引用]
[回复]
[ top ] | |
荣誉值:6
信誉值:2
注册日期:2010-12-02 13:35 |
对了,一时间忘记保存寄存器的值了,只需要保存cx和si的值 | | |
|
|
|
|
[第12楼]
[ 回复时间:2012-05-07 20:06 ]
[引用]
[回复]
[ top ] | |
荣誉值:6
信誉值:2
注册日期:2010-12-02 13:35 |
8楼的不敢苟同,
letterc1:
mov ax,ds:[si]
mov cx,ax
jcxz letterc3
注意段里面的每个字母只占8位,但你这里同时将2位字母赋给cx了,虽然你的程序最红结果或许是对的,但是这里逻辑上不妥当,不能让人一眼就能看明白,还是不要这样为好 | | |
|
|
|
|
[第13楼]
[ 回复时间:2017-07-20 11:13 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2017-07-20 09:18 |
mov dx,ds:[si]
mov cx,ax
如果最后的一个单字节是字母,高一个字节是0
那岂不是复制一个’字符‘、0了吗?比如:44 00 复制后ax=0044h,ax不为0,多出循环一次。 | | |