鱼C论坛

 找回密码
 立即注册
查看: 1926|回复: 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?求解。






小甲鱼最新课程 -> https://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 .......
求解。。。。。
小甲鱼最新课程 -> https://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......到底是哪里出了问题呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

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

  6. code segment
  7. start: mov ax,12666
  8.        mov bx,data
  9.        mov ds,bx
  10.        mov si,0
  11.        call dtoc

  12.        mov dh,8
  13.        mov dl,3
  14.        mov cl,2
  15.        call show_str

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

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

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

  33. show_str: mov ax,0B800H
  34.           mov es,ax
  35.           mov di,0

  36.           mov al,0A0H
  37.           mul dh
  38.           add di,ax

  39.           mov al,2
  40.           mul dl
  41.           add di,ax

  42.           mov bl,cl
  43.        s: mov cl,[si]
  44.           mov ch,0
  45.           jcxz ok
  46.           mov es:[di],cl
  47.           mov es:[di+1],bl
  48.           add di,2
  49.           inc si
  50.           loop s
  51.       ok: ret
  52. code ends
  53. end start
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-3-9 23:52:31 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2014-3-12 15:58:24 | 显示全部楼层
看不懂啊,也太高大上了吧
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-12 21:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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