鱼C论坛

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

实验十一没搞懂。

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

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

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

x
我没有看实验十一的答案自己写的一个,从逻辑上讲得通啊,但是编译不过。求错误点
  1. assume cs:code
  2. data segment
  3. db "Beginner's All-purpose Symbolic Instruction Code.",0
  4. data ends

  5. code segment
  6. begin:mov ax,data
  7.            mov ds,ax
  8.            mov si,0
  9.            call letterc
  10.           
  11.            mov ax,4c00h
  12.            int 21
  13.                     
  14. letterc:mov cl,ds:[si]
  15.            mov ch,0
  16.            jcxz t
  17.            mov al,cl
  18.            sub al,20h
  19.            cmp al,41h      
  20.            jna s
  21.                
  22.             mov ds:[si],al
  23.           s:inc si  
  24.       loop letterc
  25.       t:ret
  26. code ends
  27. 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有影响的命令。
我的源码:

  1. assume cs:code
  2. data segment
  3.         db "Beginner's All-purpose Symbolic Instruction Code.",0
  4. data ends

  5. code segment
  6.         begin:
  7.         mov ax,data
  8.         mov ds,ax
  9.         mov si,0
  10.         mov bx,0   ;初始化,用低8位暂存被比较值
  11.         call letterc
  12.        
  13.         mov ax,4c00h
  14.         int 21h
  15.        
  16.         letterc:
  17.         mov bl,[si]
  18.         cmp bl,00h
  19.         je ok  ;等于0就调到结束处,用于判断字符串的尾部。
  20.         inc si
  21.         cmp bl,61h
  22.         jb letterc
  23.         cmp bl,7ah
  24.         ja letterc     ; 本行+以上3行,判断从内存中读出的值,是不是小写字母。
  25.         and bl,11011111b  ;这句实现小写到大写的转换。
  26.         mov [si-1],bl   ;把转换好的值写回内存,地址为什么减1,看前面源码就知道了。
  27.         jmp letterc       
  28. ok:
  29.         ret
  30.        
  31. code ends
  32. 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一楼的代码可以编译过去啊,发表后改过了?

  1. -g b
  2. AX=0B0E  BX=0000  CX=0000  DX=0000  SP=0000  BP=0000  SI=0031  DI=0000
  3. DS=0B63  ES=0B53  SS=0B63  CS=0B67  IP=000B   NV UP EI PL NZ NA PO CY
  4. 0B67:000B B8004C        MOV     AX,4C00
  5. -d 0b63:0
  6. 0B63:0000  42 45 47 49 4E 4E 45 52-27 53 20 41 4C 4C 2D 50   BEGINNER'S ALL-P
  7. 0B63:0010  55 52 50 4F 53 45 20 53-59 4D 42 4F 4C 49 43 20   URPOSE SYMBOLIC
  8. 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-3-29 13:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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