回 帖 发 新 帖 刷新版面

主题:求教一个程序问题!!!(急)

我在书上看到一个题,是这样的,补全程序,功能是:从SOURCE开始的单元中连续存放着10个压缩BCD数,统计这10个数中0,1,2,3,4,...,9出现的次数,结果存入指定定的内存区域.如数为01H,35H,86H,31H,25H,97H,63H,48H,84H,则结果为:01H,02H,02H,03H,02H,02H,01H,03H,02H.
程序补齐后如下:
extrn load:far,save:far
n equ 10
dseg     segment
source   db n dup(?)
result   db n dup(0)
name0    db 'input.dat',0
name1    db 'output.dat',0
dseg     ends
sseg     segment stack
         db 256 dup (?)
sseg     ends
cseg     segment
         assume cs:cseg,ds:dseg,ss:sseg
start    proc far
         push ds
         xor ax,ax
         push ax
         mov ax,dseg
         mov ds,ax
         lea dx,source
         lea si,name0
         mov cx,n
         call load
;**************************************************
         lea si,source
         mov cx,n
         mov bx,0
again:   mov al,[si]
         mov ah,al
         and al,0fh
         and ah,0f0h
         push cx
         mov cl,4
         shr ah,cl
         pop cx
         [color=0000FF][color=FF0000][color=0000FF][color=FF0000][color=C0C0C0][color=FF0000][color=0000FF][color=FF0000][color=C0C0C0][color=FF00FF]mov bl,ah
         mov di,bx
         inc result[di]
         mov bl,al
         mov di,bx
         inc result[di][/i] [/color][/color][/color][/color][/color][/color][/color][/color][/color][/color]        inc si
         loop again
;***************************************************
         lea dx,result
         lea si,name1
         mov cx,n
         call save
         ret
start    endp
cseg     ends
         end start
请指教一下其中的"
         mov bl,ah
         mov di,bx
         inc result[di]
         mov bl,al
         mov di,bx
         inc result[di]"几个语句怎么理解啊,我看了半天一头雾水,搞不明白它是怎么进行比较的..
书上的解释是:"当对数据进行判断的时候,由于数据的大小刚好对应其在RESULT中结果存储的位置,所以判断以后直接将RESULT的相应存储单元加1即可,空处应填INC RESULT[[i]DI]"
  那mov bl,ah;mov di,bx/mov bl,al; mov di,bx是怎么判断的呢??
  准备考三级呢,有点悬啊.
  各位大虾看到了请赶快救火啊!!!!![/i] 谢了!


[fly]谢了![/fly][color=FFFFFF][/color]

回复列表 (共2个回复)

沙发

将循环部分加上注释,不知你能否理解

again:   mov al,[si] ;取出每个字符
         mov ah,al   ;
         and al,0fh  ;高四bit 清零,低四bit不变
         and ah,0f0h ;低4bit清零,高4bit不变
         
         push cx
         mov cl,4
         shr ah,cl  ;右移4位,得到高4bit
         pop cx     ;恢复cx
         
         mov bl,ah   ;高4位的值送入bl
         mov di,bx      
         inc result[di] ;将对应的计数器加一
                        ;c 语言表示法,若高四位为i, 则result[i]++
         
         mov bl,al     ;低4位的值送入bl
         mov di,bx
         inc result[di]
                        ;c 语言表示法,若低四位为i, 则result[i]++
         inc si
         loop again

板凳

谢了,程序在我发帖子时调整字体时候不知怎么搞的多出了[I/],即INC RESULT[DI]后面,INC SI前的那个。当然liangbch是看出来了,可能误解了大家,不好意思。回贴很不错,不过上午我突然搞明白了是怎么回事。谢了啊!!

我来回复

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