鱼C论坛

 找回密码
 立即注册
查看: 3177|回复: 5

实验十一没搞懂。

[复制链接]
发表于 2011-3-21 17:06:15 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
我没有看实验十一的答案自己写的一个,从逻辑上讲得通啊,但是编译不过。求错误点
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
           call letterc
           
           mov ax,4c00h
           int 21
                     
letterc:mov cl,ds:[si]
           mov ch,0
           jcxz t
           mov al,cl
           sub al,20h
           cmp al,41h       
           jna s
                
            mov ds:[si],al
          s:inc si  
      loop letterc
      t:ret
code ends
end begin
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-3-22 13:48:18 | 显示全部楼层
消灭0回复..
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-3-23 22:14:33 | 显示全部楼层
本帖最后由 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,[si]
        cmp bl,00h
        je ok  ;等于0就调到结束处,用于判断字符串的尾部。
        inc si
        cmp bl,61h
        jb letterc
        cmp bl,7ah
        ja letterc     ; 本行+以上3行,判断从内存中读出的值,是不是小写字母。
        and bl,11011111b  ;这句实现小写到大写的转换。
        mov [si-1],bl   ;把转换好的值写回内存,地址为什么减1,看前面源码就知道了。
        jmp letterc        
ok:
        ret
        
code ends
end begin
letterc部分思路是这样,先确定是否为需要转换的小写字母,如果是就转换,并写回内存。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-3-24 12:06:04 | 显示全部楼层
本帖最后由 ckzmo 于 2011-3-24 12:07 编辑

mov cl,ds:[si]
mov ch,0             判断CX是否为0
jcxz t
sub al,20h     把小写都换成大写 ASC码-20H
cmp al,41h    然后和大写A比较  
jna s              如果值不高于大写A就跳,高于就写内存
mov ds:[si],al      
s:inc si  
loop letterc         
t:ret
哪不对?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-3-24 12:10:38 | 显示全部楼层
我这个这么容易看懂居然说看不懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-3-27 08:21:45 | 显示全部楼层
本帖最后由 木吉他 于 2011-3-27 08:28 编辑

LZ一楼的代码可以编译过去啊,发表后改过了?
-g b
AX=0B0E  BX=0000  CX=0000  DX=0000  SP=0000  BP=0000  SI=0031  DI=0000
DS=0B63  ES=0B53  SS=0B63  CS=0B67  IP=000B   NV UP EI PL NZ NA PO CY
0B67:000B B8004C        MOV     AX,4C00
-d 0b63:0
0B63:0000  42 45 47 49 4E 4E 45 52-27 53 20 41 4C 4C 2D 50   BEGINNER'S ALL-P
0B63:0010  55 52 50 4F 53 45 20 53-59 4D 42 4F 4C 49 43 20   URPOSE SYMBOLIC
0B63:0020  49 4E 53 54 52 55 43 54-49 4F 4E 20 43 4F 44 45   INSTRUCTION CODE
DEBUG检查结果,小写已经改为大写.
那个ds:[si],直接写[si]就可以的.如果没有特别指明,si默认和DS数据段关联.

==========分割线==========
刚又看了下你的代码,有一个错误.不过编译还是可以通过的.
mov ah, 4ch
int 21 ;这里如果不加h就成十进制了 就成 int 15h 中断了.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-19 09:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表