鱼C论坛

 找回密码
 立即注册
查看: 1719|回复: 5

实验10.3

[复制链接]
发表于 2014-3-8 11:58:13 | 显示全部楼层 |阅读模式
30鱼币
本帖最后由 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:[si]
    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:[si]
         mov es:[di],cx                ;把数据段的第一字符复制到目标地址
         mov byte ptr es:[di+1],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?求解。






想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 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:[si]
         mov byte ptr es:[bp],cl       ;把数据段的第一字符复制到目标地址
         mov byte ptr es:[bp+1],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],si=0,inc si。36 36 36 32 31 30 .......
求解。。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 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:[si]
                  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:[si]
         mov es:[di],cx                ;把数据段的第一字符复制到目标地址
         mov byte ptr es:[di+1],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:[si],0开始:30 00 31 00 32 00 36 00 36 00 36 00......到底是哪里出了问题呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-3-9 16:08:04 | 显示全部楼层
07170301_hzz8.png

以下代码供参考:
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 [si],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,[si]
          mov ch,0
          jcxz ok
          mov es:[di],cl
          mov es:[di+1],bl
          add di,2
          inc si
          loop s
      ok: ret
code ends
end start
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-3-9 23:52:31 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-3-12 15:58:24 | 显示全部楼层
看不懂啊,也太高大上了吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-18 00:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表