实验十一没搞懂。
我没有看实验十一的答案自己写的一个,从逻辑上讲得通啊,但是编译不过。求错误点assume cs:codedata segment
db "Beginner's All-purpose Symbolic Instruction Code.",0
data ends
code segment
begin:mov ax,data
mov ds,ax
mov si,0
call letterc
mov ax,4c00h
int 21
letterc:mov cl,ds:
mov ch,0
jcxz t
mov al,cl
sub al,20h
cmp al,41h
jna s
mov ds:,al
s:inc si
loop letterc
t:ret
code ends
end begin 消灭0回复.. 本帖最后由 china0008 于 2011-3-23 22:18 编辑
你letterc部分我没看到啥意思,19行那里,为啥要减20H ?
对于这个题目,最好不要使用对 flag有影响的命令。
我的源码:
assume cs:code
data segment
db "Beginner's All-purpose Symbolic Instruction Code.",0
data ends
code segment
begin:
mov ax,data
mov ds,ax
mov si,0
mov bx,0 ;初始化,用低8位暂存被比较值
call letterc
mov ax,4c00h
int 21h
letterc:
mov bl,
cmp bl,00h
je ok;等于0就调到结束处,用于判断字符串的尾部。
inc si
cmp bl,61h
jb letterc
cmp bl,7ah
ja letterc ; 本行+以上3行,判断从内存中读出的值,是不是小写字母。
and bl,11011111b;这句实现小写到大写的转换。
mov ,bl ;把转换好的值写回内存,地址为什么减1,看前面源码就知道了。
jmp letterc
ok:
ret
code ends
end begin
letterc部分思路是这样,先确定是否为需要转换的小写字母,如果是就转换,并写回内存。 本帖最后由 ckzmo 于 2011-3-24 12:07 编辑
mov cl,ds:
mov ch,0 判断CX是否为0
jcxz t
sub al,20h 把小写都换成大写 ASC码-20H
cmp al,41h 然后和大写A比较
jna s 如果值不高于大写A就跳,高于就写内存
mov ds:,al
s:inc si
loop letterc
t:ret
哪不对? 我这个这么容易看懂居然说看不懂 本帖最后由 木吉他 于 2011-3-27 08:28 编辑
LZ一楼的代码可以编译过去啊,发表后改过了?
-g b
AX=0B0EBX=0000CX=0000DX=0000SP=0000BP=0000SI=0031DI=0000
DS=0B63ES=0B53SS=0B63CS=0B67IP=000B NV UP EI PL NZ NA PO CY
0B67:000B B8004C MOV AX,4C00
-d 0b63:0
0B63:000042 45 47 49 4E 4E 45 52-27 53 20 41 4C 4C 2D 50 BEGINNER'S ALL-P
0B63:001055 52 50 4F 53 45 20 53-59 4D 42 4F 4C 49 43 20 URPOSE SYMBOLIC
0B63:002049 4E 53 54 52 55 43 54-49 4F 4E 20 43 4F 44 45 INSTRUCTION CODE
DEBUG检查结果,小写已经改为大写.
那个ds:,直接写就可以的.如果没有特别指明,si默认和DS数据段关联.
==========分割线==========
刚又看了下你的代码,有一个错误.不过编译还是可以通过的.
mov ah, 4ch
int 21 ;这里如果不加h就成十进制了 就成 int 15h 中断了.
页:
[1]