注册 登录
编程论坛 汇编论坛

自己编的9*9 乘法表,debug 反应出来的不怎么对啊,求解释

zhu224039 发布于 2012-10-11 14:47, 2253 次点击
程序代码:
date segment
       mulshu dw 0
       bmul   dw 0
       muls   dw 81 dup(?)
date   ends
code   segment
       assume cs:code,ds:date
start: mov ax,date
       mov ds,ax
       mov si,offset muls
      
mulsm: mov ax,bmul
       mul mulshu
       mov [si],ax
       inc si
       inc bmul
       cmp bmul,9
       jle mulsm
       inc mulshu
       mov bmul,0
       cmp mulshu,9
       jle mulsm

       mov ah,4ch
       int 21h
code ends
     end start[local]1[/local]
61 回复
#2
zhu2240392012-10-11 14:50
这个 内存里放的是什么嘛
起先是 0003
其后是 0009
再其后就是0000
按照我的程序来是应该是 9个 0000的数据,但是 数了下 才6个
其后的  1*1=1  在内存里 放的话 应该是0001 才对啊   怎么 直接给我 01 02 03 04 05  这么给显示了呢

混乱中   求大神
莫非 编译器 把咱的程序给 优化了,所以我就错了?

[ 本帖最后由 zhu224039 于 2012-10-11 14:53 编辑 ]
#3
zhu2240392012-10-11 15:05
程序的功能很简单
 
for(i=0;i<=9;i++)
   for(j=0;j<=9,j++)
     *(x+j)=i*j;

就这么个功能
#4
zhu2240392012-10-11 15:07
明白了 inc si   呵呵  要改成 add si,2
#5
有容就大2012-10-11 15:11
呵呵 帮顶。。。
#6
zhu2240392012-10-11 15:12
回复 5楼 有容就大
大数相乘的程序 你写了没有
#7
有容就大2012-10-11 15:20
回复 6楼 zhu224039
还没呢 道行不够 看你的啦
#8
有容就大2012-10-11 15:25
能搞出这个效果来吗?
只有本站会员才能查看附件,请 登录



[ 本帖最后由 有容就大 于 2012-10-11 15:30 编辑 ]
#9
zhu2240392012-10-11 15:28
回复 7楼 有容就大
你就是懒不肯查资料
其实我也不想 去查  嘿嘿
总是在这 加减乘除  大于等于小于不等于,是 不是,循环 条件判定  最后编制出了一个程序 运行在黑黑的窗体下

我腻烦了

我要写病毒 写网络程序  然后偷鸡摸狗去

有容兄 听说你藏书多 贡献几本呗
#10
zhu2240392012-10-11 15:29
回复 8楼 有容就大
这个可以的呀  这么简单的事情
要不现场给编出来?
#11
有容就大2012-10-11 15:32
回复 9楼 zhu224039
我那有什么书啊 偶尔去传几本到下载频道上罢了。
#12
zklhp2012-10-11 15:32
膜拜大牛
#13
有容就大2012-10-11 15:33
以下是引用zhu224039在2012-10-11 15:29:36的发言:

这个可以的呀  这么简单的事情
要不现场给编出来?

现编吧 我吃完晚饭来分享你的心得 看用时多少啊 哈哈。。
#14
zhu2240392012-10-11 16:59
我有点事情要出去了   回来了 就给你代码  现在代码 在=  号后面有点错误
date segment
       mulshu dw 0
       bmul   dw 0
       muls   dw 81 dup(?)
     jieguo   db 10 dup(?),'$'
date   ends
code segment
     assume cs:code,ds:date
start: mov ax,date
       mov ds,ax
       mov si,offset muls
      
mulsm: mov ax,bmul
       mul mulshu
       mov [si],ax
       mov bx,mulshu
       mov cx,bmul
       add cx,30h
       add bx,30h
       mov ah,02
       mov dl,cl
       int 21h
       mov ah,02
       mov dl,42
       int 21h
       mov ah,02
       mov dl,bl
       int 21h
       mov ah,02
       mov dl,61
       int 21h
 
       mov ax,[si]
       mov cx,0
   s:  mov dx,0
       mov bx,10
       div bx
       add dl,30h
       add cx
       cmp ax,0
       jz s

       mov ah,02
       mov dl,32
       int 21h
       inc bmul
       add si,2
       mov cx,bmul
       cmp cx,mulshu
       jle mulsm
       mov ah,02
       mov dl,0dh
       int 21h
       mov ah,02
       mov dl,0ah
       int 21h
       inc mulshu
       mov bmul,0
       cmp mulshu,9
       jle mulsm
       mov ah,4ch
       int 21h
code ends
     end start
         
      
这个是代码  还有一点点错误 ,回来了解决
#15
zhu2240392012-10-11 17:31
date segment
       mulshu dw 0
       bmul   dw 0
       muls   dw 81 dup(?)
     jieguo   db 2 dup(?)
date   ends
code segment
     assume cs:code,ds:date
start: mov ax,date
       mov ds,ax
       mov si,offset muls
      
mulsm: mov ax,bmul
       mul mulshu
       mov [si],ax
       mov bx,mulshu
       mov cx,bmul
       add cx,30h
       add bx,30h
       mov ah,02
       mov dl,cl
       int 21h
       mov ah,02
       mov dl,42
       int 21h
       mov ah,02
       mov dl,bl
       int 21h
       mov ah,02
       mov dl,61
       int 21h
 
       mov ax,[si]
       mov cx,0
       mov dx,0
    s: mov bx,10
       div bx
       add dl,30h
       mov si,offset jieguo
       mov [si],dl
       inc cx
       inc si
       cmp ax,0
       jnz s
   s1: mov dl,[si-1]
        mov ah,02
        int 21h
        dec si
        loop s1

       mov ah,02
       mov dl,32
       int 21h
       inc bmul
       add si,2
       mov cx,bmul
       cmp cx,mulshu
       jle mulsm
       mov ah,02
       mov dl,0dh
       int 21h
       mov ah,02
       mov dl,0ah
       int 21h
       inc mulshu
       mov bmul,0
       cmp mulshu,9
       jle mulsm
       mov ah,4ch
       int 21h
code ends
     end start
         
#16
zhu2240392012-10-11 17:32
只有本站会员才能查看附件,请 登录
#17
zhu2240392012-10-11 17:33
这个怎么调试啊   这个调试通过了 就 没有问题了。
好了,晚上8点多 回来后再说
#18
有容就大2012-10-11 17:47
回复 17楼 zhu224039
把代码分下段 然后关键的地方给点注释吧 555
我看你程序的第一感觉是 不能显示2位数的问题吧。。。
#19
有容就大2012-10-11 17:56
。。。要调整几个地方
不用子函数也行。


[ 本帖最后由 有容就大 于 2012-10-11 18:21 编辑 ]
#20
TonyDeng2012-10-11 17:56
还未结帖,我来学习了。
#21
有容就大2012-10-11 17:59
以下是引用TonyDeng在2012-10-11 17:56:25的发言:

还未结帖,我来学习了。

真爱雪袭啊
#22
小习小习2012-10-11 18:02
真的来学习了
#23
有容就大2012-10-11 18:22
以下是引用zhu224039在2012-10-11 17:33:17的发言:

这个怎么调试啊   这个调试通过了 就 没有问题了。
好了,晚上8点多 回来后再说
呵呵 你还真不错啊
我帮你改了几个地方 出结果了
你再看看先。。。
只有本站会员才能查看附件,请 登录

#24
有容就大2012-10-11 19:46
以下是引用小习小习在2012-10-11 18:02:38的发言:

真的来学习了

小习兄 也上个代码亮亮相?
#25
zhu2240392012-10-11 20:29
回复 24楼 有容就大
那个 jmp的错误  是怎么发生的 啊   求解释
#26
有容就大2012-10-11 20:39
在两位数除以10的时候你那个循环搞错了
程序代码:
       mov ax,[si]
       mov cx,0
       mov dx,0
    s: mov bx,10
       div bx
       add dl,30h
       mov si,offset jieguo
       mov [si],dl
       inc cx
       inc si
       cmp ax,0
       jnz s
显然 每次循环si都应该指向结果的第一个位置,不然循环几次后就超出原来jieguo的范围
你用的是双字除法 而99乘法表的相乘结果最大也只是一个字节(81), 那么这样要保证dx在每次
循环时必须为0
所以应该改为
程序代码:
       mov ax,[si]
       mov cx,0
       mov si,offset jieguo
    s: mov bx,10
       mov dx,0
       div bx
       add dl,30h
       mov [si],dl
       inc cx
       inc si
       cmp ax,0
       jnz s

#27
zhu2240392012-10-11 20:44
呵呵  明白了
#28
zhu2240392012-10-11 20:47
回复 27楼 zhu224039
只有本站会员才能查看附件,请 登录
#29
zhu2240392012-10-11 20:48
还是这么个错误提示呀呀呀
#30
有容就大2012-10-11 20:49
回复 28楼 zhu224039
不是吧 一样的程序 啊
只有本站会员才能查看附件,请 登录

#31
zhu2240392012-10-11 20:54
把代码发出来  我的怎么就不成了呢
说我跳的远了
#32
有容就大2012-10-11 20:55
回复 31楼 zhu224039
你自己的代码 我只是稍微修改了下
程序代码:
date segment
       mulshu dw 0
       bmul   dw 0
       muls   dw 81 dup(?)
     jieguo   db 2 dup(?)
date   ends
code segment
     assume cs:code,ds:date
start: mov ax,date
       mov ds,ax
       mov si,offset muls
     

mulsm: mov ax,bmul
       mul mulshu
       mov [si],ax
       mov bx,mulshu
       mov cx,bmul
       add cx,30h
       add bx,30h
       mov ah,02
       mov dl,cl
       int 21h
       mov ah,02
       mov dl,42
       int 21h
       mov ah,02
       mov dl,bl
       int 21h
       mov ah,02
       mov dl,61
       int 21h

       mov ax,[si]
       mov cx,0
       mov si,offset jieguo
    s: mov bx,10
       mov dx,0
       div bx
       add dl,30h
       mov [si],dl
       inc cx
       inc si
       cmp ax,0
       jnz s

   s1: mov dl,[si-1]
        mov ah,02
        int 21h
        dec si
        loop s1

       mov ah,02
       mov dl,32
       int 21h
       inc bmul
       add si,2
       mov cx,bmul
       cmp cx,mulshu
       jle mulsm
       mov ah,02
       mov dl,0dh
       int 21h
       mov ah,02
       mov dl,0ah
       int 21h
       inc mulshu
       mov bmul,0
       cmp mulshu,9
       jle mulsm
  
       mov    ah, 1
       int 21h
       mov ah,4ch
       int 21h

code ends
     end start

#33
小习小习2012-10-11 20:55
以下是引用有容就大在2012-10-11 19:46:12的发言:


小习兄 也上个代码亮亮相?
有容大哥,刚上军事装备课去了,汇编我从看到第8章,给我几天我就整出来,我现在准备用C语言写个学生管理系统,正在仿制你以前写的帖子。你不会介意我侵权吗?
#34
有容就大2012-10-11 20:57
以下是引用小习小习在2012-10-11 20:55:44的发言:

 有容大哥,刚上军事装备课去了,汇编我从看到第8章,给我几天我就整出来,我现在准备用C语言写个学生管理系统,正在仿制你以前写的帖子。你不会介意我侵权吗?

我那个很粗糙的哦 你怎么倒腾我都不介意。。。
#35
zhu2240392012-10-11 20:58
我的亲  用你的代码 我也编译不过去
你用的什么编译器啊   我的是masm5.0
#36
小习小习2012-10-11 21:01
回复 34楼 有容就大
呵呵,紧追大哥步伐,对不起楼主,跑题了
#37
有容就大2012-10-11 21:01
回复 35楼 zhu224039
要不你在代码最前面加个.386试试吧
我的是masm5.0啊
#38
小习小习2012-10-11 21:01
回复 35楼 zhu224039
搞个MASMPLUS
#39
有容就大2012-10-11 21:02
回复 38楼 小习小习
确实 这样选择多点。
#40
zhu2240392012-10-11 21:06
这个掉的大了, 你的编译器能编过去 我的编译器就不行   哎   哎  哎  

我真的那么衰么,今天出门就出了洋相 回来还出这么个怪物的错误   造孽啊
#41
有容就大2012-10-11 21:09
以下是引用zhu224039在2012-10-11 21:06:06的发言:

这个掉的大了, 你的编译器能编过去 我的编译器就不行   哎   哎  哎  

我真的那么衰么,今天出门就出了洋相 回来还出这么个怪物的错误   造孽啊

呵呵 去看了 版本 我try文件里的版本是6.15
去masm5.0里试了下确实不让跳
我的天 误导你了 不好意思啊
你下个masm6.11以上的吧就三个文件 要么我传给你
只有本站会员才能查看附件,请 登录

#42
zhu2240392012-10-11 21:09
加了 .386  编译时通过了,得不出结果
#43
有容就大2012-10-11 21:12
回复 42楼 zhu224039
直接下我传那个 就三个文件
然后保存到一个D盘新建的文件里 比如try最后把你的.asm文件和这三个文件放一起
debug的时候 进入这个文件 用masm xx.asm命令
#44
有容就大2012-10-11 21:24
要不我发一个MASMPlus版本的你看看?
只有本站会员才能查看附件,请 登录

---
程序代码:
;#Mode=DOS
;
MASMPlus
;
--------------------------------------------------------------------
;
--------------------------------------------------------------------
;
program name:            9*9 Multiplication Table
;
producer:                yrjd
;
program function:        Show a 9*9 Multiplication Table
;
produce data:            2012-10-11  Thursday
;
--------------------------------------------------------------------
assume cs:code, ds:data, ss:stack

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

data segment
String        db 128 dup ('$')
Multi         db ?
RltPrompt     db 'The result is : ', '$'
EndPrompt     db 'Press any key to continue', '$'
data ends

code segment
start:                  ; Segment register initialize 段寄存器初始化
                        mov    ax, stack
                        mov    ss, ax
                        mov    sp, 128            
                        mov    ax, data
                        mov    ds, ax                 

                        ; Prompt and Output the result  提示并输出结果
                        lea     dx, RltPrompt
                        mov     ah, 09h
                        int     21h
                        call     crlf
                        call    crlf
                    
                      ; Use two Loops to Show the Multiplication Table
                      ; 用两个循环来计算并显示乘法表
                        mov    cx, 9
                        mov    al, 1
          OuterLoop:    mov    si, 0
                        mov    dl, 1
          InnerLoop:    mov    ah, al
                        mov    dh, dl
                        add    ah, 30h
                        add    dh, 30h
                        call    MulAndStore
                        mov    String[si], ah
                        mov    String[si + 1], '*'
                        mov    String[si + 2], dh
                        mov    String[si + 3], '='
                        inc    dl
                        add    si, 8
                        cmp    dl, al
                        jna    InnerLoop
                        push    ax
                        lea    dx, String
                        mov    ah, 09h
                        int     21h
                        pop    ax
                        call    crlf
                        add    al, 1
                        loop    OuterLoop
               
                        call   crlf
              
                        ; Output End Prompt 输出结束提示
                        lea    dx, EndPrompt
                        mov    ah, 09h
                        int    21h
                     
                        ; View the result and Return DOS 查看结果并返回DOS
                        mov    ah, 01h
                        int    21h
                        mov    ah, 4ch
                        int    21h         

                        ; Convert the multiplication to character
                        ; 把乘积转换为字符
    MulAndStore:        push    ax
                        push    bx
                        push    cx
                        push    dx
                        push    si
                        push    di
                  
                        mov    ah, 0
                        mul    dl
                        mov    dl, 10
                        div    dl
                        cmp    al, 0
                        jz    Single
                        jnz    Pair
             Single:    add    ah, 30h
                        mov    String[si + 4], ah
                        mov    String[si + 5], ' '
                        mov    String[si + 6], ' '
                        mov    String[si + 7], ' '
                        jmp    OK
               Pair:    add    al, 30h
                        mov    String[si + 4], al
                        add    ah, 30h
                        mov    String[si + 5], ah
                        mov    String[si + 6], ' '
                        mov    String[si + 7], ' '           

                 OK:    pop    di
                        pop    si
                        pop    dx
                        pop    cx
                        pop    bx
                        pop    ax
                        ret
         
                       ; The function of  Carriage-Return Line-Feed 回车换行
crlf:                   push    ax
                        push    dx
                        mov     dl, 0dh
                        mov     ah, 02h
                        int     21h
                        mov     dl, 0ah
                        mov     ah, 02h
                        int     21h
                        pop    dx
                        pop    ax
                        ret
               
divdw:                ; not overflow  division   实施不溢出除法获取除10的余数
                        push    si
                        push    di
                        push    ax
               
                        mov     ax, dx
                        mov     dx, 0
                        div     cx
                        mov     si, ax
                        pop     ax
                        div     cx
                        mov     cx, dx
                        mov     dx, si                 

                        pop     di
                        pop     si                 

                        ret                     
code ends

end start

#45
zhu2240392012-10-11 21:36
回复 44楼 有容就大
mov    ah, 1
       int 21h
     为什么要在最后加上这个语句 后 才能把字符显示出来呢
#46
zhu2240392012-10-11 21:41
为什么不用子程序功能呢  

CALL 也能直接引用标号  而不是过程名  这个学习了


汇编语言 看来我还只是个皮毛啊
#47
zhu2240392012-10-11 21:59
不告诉我,我也不找答案了,去看《计算机网络系统方法》去了

你想来看么?  嘿嘿
#48
zhu2240392012-10-11 22:26
牛气 ,我正在整编自己的程序  让他也能运行起来
#49
有容就大2012-10-12 12:27
以下是引用zhu224039在2012-10-11 21:36:38的发言:

 mov    ah, 1
       int 21h
     为什么要在最后加上这个语句 后 才能把字符显示出来呢
这是21中断功能 等待用户输入一个字符并回显。

[ 本帖最后由 有容就大 于 2012-10-12 12:56 编辑 ]
#50
有容就大2012-10-12 12:28
以下是引用zhu224039在2012-10-11 21:59:01的发言:

不告诉我,我也不找答案了,去看《计算机网络系统方法》去了

你想来看么?  嘿嘿
5555 我的包年网费到期了 这段时间惨了
来网吧 看帖的。。。这里什么软件都没有 机器也不好使 擦!
#51
小习小习2012-10-12 12:29
回复 50楼 有容就大
难怪看不到你
12