ckzmo 发表于 2011-3-21 17:06:15

实验十一没搞懂。

我没有看实验十一的答案自己写的一个,从逻辑上讲得通啊,但是编译不过。求错误点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:
         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

ckzmo 发表于 2011-3-22 13:48:18

消灭0回复..

china0008 发表于 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,
        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:06:04

本帖最后由 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
哪不对?

ckzmo 发表于 2011-3-24 12:10:38

我这个这么容易看懂居然说看不懂

木吉他 发表于 2011-3-27 08:21:45

本帖最后由 木吉他 于 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]
查看完整版本: 实验十一没搞懂。