回 帖 发 新 帖 刷新版面

主题:初学者问题

大家好!我是初学者,有个菜鸟问题
name  length_of_string

data segment
string  db    'abcduvwxyz',0dh
ll      db    ?
cr      equ   0dh
data    ends  
stack   segment para  stack'stack'
        db    100dup(?)
stack   ends
code    segment
        assume  cs:code,ds:data,es:data,ss:stack
start    proc  far
begin:  push  ds
       mov     ax,0
      push     ax
   mov     ax,data
   mov     ds,ax
   mov     es,ax
   lea      di,string               
   mov     dl,0                  
   mov     al,cr                  
again:  scasb                          
   je       done                  
   inc      dl                    
   jmp     again
done:  lea    bx,ll
   mov    [bx],dl
   ret
start   endp
code   ends
   end     begain
这是一个确定字符串长度的程序,前面这一段初始化的程序看不懂,为什么要有?请高手指点!谢谢!

begin:  push  ds
       mov     ax,0
      push     ax
   mov     ax,data
   mov     ds,ax
   mov     es,ax

回复列表 (共9个回复)

沙发

我也搞不懂,那是干吗的

;下面是我重写的,同样功能
name  length_of_string


stack   segment para  stack 'stack'
        db    100 dup(?)
stack   ends

data segment
cr      equ   0dh
string  db    'abcduvwxyz', cr
ll      db    ?
data    ends


code    segment
        assume  cs:code, ds:data, es:data, ss:stack
start   proc  far
        mov        ax, data
        mov        ds, ax
        mov        es, ax

        cld
        mov        di, offset string
        mov        al, cr
        mov        cx, 0FFFFH
        repnz    scasb
        not        cx
        dec        cx
        mov        ll, cl

        ret
start   endp
code    ends
        end     start

板凳

ff

3 楼

不是啊,这是我在教材上看到的,介绍循环时举的例子.就举了这么一段

4 楼

求助~~~~~~~~~

5 楼

晕,没有看过这样费事的程序

6 楼

这样啊?这可是教材上的例子啊!

7 楼

对不起,是我错了,那还是有用的

start 的属性为远过程,最后面的 ret 指令要从堆栈中取出调用者段地址和 IP 地址,但是现在的堆栈中地址是 0000:0000, 所以需要自己重新压入一些值改变过程返回的地址,或最后自己使用 int 21H 的 4c 功能,或 int 20H 中断来结束程序

为何要压入 DS, 0000 呢?呵呵,因为在DS:0000 处有一个 int 20H 指令可以用于结束程序, 把控制权还给 DOS。

8 楼


找本系统的教材看看  上面什么都有

9 楼

谢谢啊!  这本来就是教材上的  看不懂~  呵呵

我来回复

您尚未登录,请登录后再回复。点此登录或注册