kyod 发表于 2014-3-8 11:58:13

实验10.3

本帖最后由 kyod 于 2014-3-9 23:57 编辑

鱼油们好,实验10.3还未完成,但是遇到了问题,DEBUG调试了很多了,也没办法找出原因,麻烦大家帮忙看看。
程序1:

assume cs:code,ds:data
data segment
db 24 dup(0)
dw 123,12666,1,8,3,38
dw 6 dup(0)
data ends
code segment
    start:mov ax,12666
          mov bx,data
          mov ds,bx
          mov si,0
          call dtoc
          mov dh,8
          mov dl,3
          mov cl,2
          call show_str
   
    mov ax,4c00h
          int 21h
    dtoc: push ax
          push bx
       push cx
       push dx
       push ds
    push si
   
    mov si,0
    s: jcxz ok
          mov cx,10
       push ax                ;把ax值放入内存
          mov ax,dx            ;把dx值赋予ax
          mov dx,0
          div cx               ;求cx商为ax,余数为dx
          mov bx,ax            ;bx为dx的值
          pop ax               ;把ax还原
          div cx               ;求cx的商,此时dx为余数,ax为cx的商
      
          mov cx,dx            ;余数赋予cx
          mov dx,bx            ;商的高位存放在dx,ax为商的低位
          push cx
    add cx,48            ;十进制数加48即30H,转化为字符
    mov bx,cx            ;把转化字符后赋予bx
    pop cx
    push bx                ;把字符入栈
    inc si               ;记录循环次数
    jmp s
   
      ok: mov cx,si
       mov si,0
   s1: pop ds:
    add si,2
    loop s1
      
       pop si
       pop ds
       pop dx
          pop cx
       pop bx
    pop ax
          ret
show_str:push ax
         push bx
   push cx
   push dx
   push es
   push di
   push si
         push ds
   
      mov si,2
   mov bl,cl
   mov ax,0b800h
         mov es,ax
      s3:jcxz ok2
         mov al,160
         mul dh                        ;ax为1280
         mov di,ax                     ;di=ax,为1280
         mov al,2
         mul dl                        ;dl乘以2,ax为它们的值
         add di,ax                     ;di为显示地址起始
         mov ch,0
         mov cx,ds:
         mov es:,cx                ;把数据段的第一字符复制到目标地址
         mov byte ptr es:,bl   ;把字符颜色改了绿色
         add si,2                      ;si自增2   
         inc dl                        ;dl自增1
         jmp s3
   
ok2:pop ds
      pop si
      pop di
   pop es
   pop dx
   pop cx
   pop bx
   pop ax
      ret
code ends
end start
运行结果:26358138为什么不是12666?求解。






kyod 发表于 2014-3-8 12:06:08

assume cs:code,ds:data

data segment
db 36h,36h,36h,32h,31h,30h,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
dw 123,12666,1,8,3,38
dw 6 dup(0)
data ends


code segment
    start:mov ax,12666
          mov bx,data
          mov ds,bx
          mov si,0
      

          mov dh,8
          mov dl,3
          mov cl,2
          call show_str
                  
                  mov ax,4c00h
          int 21h



show_str:push ax
         push bx
               push cx
               push dx
               push es
               push bp
               push si
         push ds
               
           mov bl,cl
      s3:jcxz ok2
         mov ax,0b800h
         mov es,ax
         mov al,160
         mul dh                        ;ax为1280
         mov bp,ax                     ;bp=ax,为1280
         mov al,2
         mul dl                        ;dl乘以2,ax为它们的值
         add bp,ax
         mov ch,0
         mov cl,byte ptr ds:
         mov byte ptr es:,cl       ;把数据段的第一字符复制到目标地址
         mov byte ptr es:,bl   ;把字符颜色改了绿色
         inc si                        ;si自增1      
         inc dl                        ;dl自增1
         jmp s3
   
       ok2:pop ds
             pop si
             pop bp
               pop es
               pop dx
               pop cx
               pop bx
               pop ax
             ret

code ends
end start
显示程序show_str没问题,结果:666210
调试计算程序dtoc,结果在数据段ds:,si=0,inc si。36 36 36 32 31 30 .......
求解。。。。。

kyod 发表于 2014-3-8 17:06:55

assume cs:code,ds:data

data segment
db 24 dup(0)
dw 123,12666,1,8,3,38
dw 6 dup(0)
data ends

code segment
    start:mov ax,12666
          mov bx,data
          mov ds,bx
          mov si,0
          call dtoc

          mov dh,8
          mov dl,3
          mov cl,2
          call show_str
                  
                  mov ax,4c00h
          int 21h

    dtoc: push ax
          push bx
              push cx
              push dx
              push ds
                  push si
                  
                  mov si,0
           s: jcxz ok
          mov cx,10
              push ax                ;把ax值放入内存
          mov ax,dx            ;把dx值赋予ax
          mov dx,0
          div cx               ;求cx商为ax,余数为dx
          mov bx,ax            ;bx为dx的值
          pop ax               ;把ax还原
          div cx               ;求cx的商,此时dx为余数,ax为cx的商
      
          mov cx,dx            ;余数赋予cx
          mov dx,bx            ;商的高位存放在dx,ax为商的低位
          push cx
                  add cx,48            ;十进制数加48即30H,转化为字符
                  mov bx,cx            ;把转化字符后赋予bx
                  pop cx
                  push bx                ;把字符入栈
                  inc si               ;记录循环次数
                  jmp s
                  
             ok: mov cx,si
              mov si,0
          s1: pop ds:
                  add si,2
                  loop s1
             
              pop si
              pop ds
              pop dx
          pop cx
              pop bx
                  pop ax
          ret

show_str:push ax
         push bx
               push cx
               push dx
               push es
               push di
               push si
         push ds
               
           mov si,2
               mov bl,cl
               mov ax,0b800h
         mov es,ax
      s3:jcxz ok2
         mov al,160
         mul dh                        ;ax为1280
         mov di,ax                     ;di=ax,为1280
         mov al,2
         mul dl                        ;dl乘以2,ax为它们的值
         add di,ax                     ;di为显示地址起始
         mov ch,0
         mov cx,ds:
         mov es:,cx                ;把数据段的第一字符复制到目标地址
         mov byte ptr es:,bl   ;把字符颜色改了绿色
         add si,2                      ;si自增2   
         inc dl                        ;dl自增1
         jmp s3
   
       ok2:pop ds
             pop si
             pop di
               pop es
               pop dx
               pop cx
               pop bx
               pop ax
             ret

code ends
end start
换了方法,结果还是出不来。到底是哪里出了问题??正确结果应该是12666绿色字体。
debug查了,数据段ds:,0开始:30 00 31 00 32 00 36 00 36 00 36 00......到底是哪里出了问题呢?

小甲鱼 发表于 2014-3-9 16:08:04



以下代码供参考:assume cs:code
data segment
db 10 dup (0)
; 用于存入转换为ASCII码的数据
data ends

code segment
start: mov ax,12666
       mov bx,data
       mov ds,bx
       mov si,0
       call dtoc

       mov dh,8
       mov dl,3
       mov cl,2
       call show_str

       mov ax,4c00h
       int 21h
; 功能:将word型数据转变为表示十进制的字符串,字符串以0为结尾符
; 参数: (ax)=word型数据,ds:si指向字符串首地址
; 返回: 无
dtoc: mov si,8         ; 从存ASCII码数据段倒数第2个字节单元开始,相当于添加结尾符0
   s0: mov cx,10
       mov dx,00
       div cx
       add dx,30H         ; 余数+30H 得到ASCII码
       mov ,dl

       mov cx,ax
       jcxz break         ; 判断商是否为0,如果为0则返回

       dec si
       inc cx             ; 注意在执行loop循环时,先执行的是CX=CX-1,然后判断CX是否为0
       loop s0
break: ret

show_str: mov ax,0B800H
          mov es,ax
          mov di,0

          mov al,0A0H
          mul dh
          add di,ax

          mov al,2
          mul dl
          add di,ax

          mov bl,cl
       s: mov cl,
          mov ch,0
          jcxz ok
          mov es:,cl
          mov es:,bl
          add di,2
          inc si
          loop s
      ok: ret
code ends
end start

kyod 发表于 2014-3-9 23:52:31

小甲鱼 发表于 2014-3-9 16:08 static/image/common/back.gif
以下代码供参考:

谢谢甲鱼老师。

憨逗 发表于 2014-3-12 15:58:24

看不懂啊,也太高大上了吧
页: [1]
查看完整版本: 实验10.3