注册 登录
编程论坛 汇编论坛

谁帮我找一下这个程序的错误地方啊

悔悔 发布于 2009-12-28 23:49, 754 次点击
在DATA中存放有一字符串,编写子程序实况将其中的小写字母改为大写字母。
      data   segment
      DATA   db  '1234abhfgELF78'
      count   euq   $-DATA
      data    ends
      code    segment
              aussme  cs:code,  ds:data
      main    proc  far
      push    ds
      mov     ax,00h
      push    ax
      mov     ax,data
      mov     ds,ax
      mov     SI,0
      mov     cx,count
   h1:mov     al,DATA[SI]
      call   fh
       sub    al,20h
       mov    DATA[SI],al
       inc    SI
       loop   h1
        ret
        main   endp
        fh      proc  near
        push    ax
        push    cx
        push    SI
         jb      h2
        mov     al,DATA[SI]
         pop     SI
         pop     cx
         pop     ax
     h2: ret
         fh      endp
        code     ends
                 end   main
4 回复
#2
philipyou2009-12-29 23:18
1、DATA 与data 有冲突,编译时是不区分大小写的,应该将DATA 换个名字
2、count   euq   $-DATA   改为count   =  $-DATA   
3、aussme  cs:code,  ds:data 中的aussme 改为 assume
4、jb      h2 这句前一般加上cmp 来作为跳转的依据
5、h2: 要放到 pop     SI 那一行 因为要进栈就要出栈
6、    call   fh
       sub    al,20h
       mov    DATA[SI],al
    这一段和子 fh      proc  near程序的逻辑可能有点乱
   我猜你想调用子程序来判断是否为小写字母 如果小于ASCII 码 61H
   就不用转了,如果大于的话就减去 20H 变为大写的ASCII 码
   但是实际上你的函数什么也没做就返回了
   而且返回后还执行了sub    al,20h就连其他代码也改变了
#3
philipyou2009-12-29 23:26
这是我在你的程序的基础上改进的红色字体为修改或添加部分
data   segment
DATA1  db  '1234abhfgELF78'      
count   =  $-DATA1
       db  '$'   
data   ends


code    segment
  assume  cs:code,ds:data
main    proc  far
      push    ds
      mov     ax,00h
      push    ax
      mov     ax,data
      mov     ds,ax
      
      
      mov     SI,0
      mov     cx,count
h1:   mov     al,DATA1[SI]
      call   fh
      inc    SI
      loop   h1
      
;============================下面这一段用来显示出字符      
      mov ah,09h
      mov dx,offset DATA1
      int 21h

      ret
main  endp
;=============================函数fh的作用是判断字母的ASCII码
                             ;是否小于61H不是的话就转换
fh      proc  near
      push    ax
      push    cx
      push    SI
      cmp     al,61h
      jb      h2
      sub    al,20h
      mov    DATA1[SI],al
h2:   pop     SI
      pop     cx
      pop     ax
      ret
fh      endp

code     ends
         end   main
#4
悔悔2009-12-31 01:10
谢谢!!!!O(∩_∩)O~
#5
ltyjyufo2010-01-01 16:46
三楼的这里:
 ;============================下面这一段用来显示出字符      
      mov ah,09h
      mov dx,offset DATA1
      int 21h
      ret
main  endp
;=============================函数fh的作用是判断字母的ASCII码
                             ;是否小于61H不是的话就转换


那 两个MOV语句好像是颠倒了,应该先获取地址,再调用功能号。。。
          mov dx,offset DATA1
          mov ah,09h
1