鱼C论坛

 找回密码
 立即注册
查看: 2735|回复: 8

[已解决]小甲鱼入门学习汇编第八章div后的数字输出问题

[复制链接]
发表于 2018-6-16 23:15:21 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 444lzx 于 2018-6-16 23:26 编辑

在小甲鱼第八章视频中,讲到用div指令计算100001除以100,商存在ax中,debug查看其结果是03e8。现在我想用dos的2号指令将这个结果以十进制形式输出,该怎么做呢?
前面的代码大概是这样的:
  1. data segment
  2.         dd 100001
  3.         dw 100
  4.         dw 0
  5. data ends
  6. assume cs:code,ds:data       
  7. code segment
  8. start:
  9.         mov ax,data
  10.         mov ds,ax
  11.         mov ax,ds:[0]
  12.         mov dx,ds:[2]
  13.         div word ptr ds:[4]
  14. code ends
  15. end start
复制代码
最佳答案
2018-6-17 13:33:57
444lzx 发表于 2018-6-17 13:15
请问你这是在汇编里面写了c函数,然后结果保存在字符串中输出吗???
那结果的进制转换做了吗?
rem = ...

这个程序是C语言和汇编语言混合编程,由汇编语言调用C语言写的函数
什么是二进制?什么是十进制?什么是十六进制?
数字在内存中就只是一个数字,看你的需求,你可以认为这个数字是十六进制(基数是16),也可以认为是十进制(基数是10),或是二进制(基数是2)
请自己复习进制转换部分

字符在内存中就是一个数字
如果是数字 3 想要显示,那就需要把数字 3 转换成字符 '3'
字符 '0' 是 0x30
字符 '3' 是 0x33
3 + 0x30 = 0x33
数字 3 加字符 '0' 等于字符 '3'
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-6-17 07:46:56 | 显示全部楼层
本帖最后由 人造人 于 2018-6-17 11:02 编辑

偷个懒,用C语言写个转换函数 ^_^
  1. assume cs:code, ds:data, ss:stack

  2. ; void far NumberToString(char *buf, int value, char str_end_flag)
  3. extrn _NumberToString:far

  4. stack segment
  5.         db 1024 dup(?)
  6. stack ends

  7. data segment
  8. buf:
  9.         db 1024 dup(?)
  10.        
  11. data ends

  12. code segment
  13. start:
  14.         mov        ax, stack
  15.         mov        ss, ax
  16.         mov        sp, 1024
  17.         mov        ax, data
  18.         mov        ds, ax
  19.        
  20.         mov        ax, '

  21. 需要用 tc 编译 Funs.c
  22. [code]static void Swap(char *a, char *b)
  23. {
  24.         char t = *a;
  25.         *a = *b;
  26.         *b = t;
  27. }

  28. void far NumberToString(char *buf, int value, char str_end_flag)
  29. {
  30.         int i = 0;
  31.         int j;
  32.         int max;
  33.         int rem;
  34.        
  35.         while(value != 0)
  36.         {
  37.                 rem = value % 10;
  38.                 value /= 10;
  39.                 buf[i++] = rem + '0';
  40.         }
  41.        
  42.         /* 字符串结束标志,dos 比较奇怪,不使用 '\0',使用 '


  43. Funs.zip (1.16 KB, 下载次数: 0)
  44.                 ; 字符串结束标志
  45.         push        ax
  46.         mov        ax, 123
  47.         push        ax
  48.         mov        ax, buf
  49.         push        ax
  50.         call        _NumberToString
  51.         add        sp, 6
  52.        
  53.         ; DS:DX=待输出字符的地址
  54.         mov        ah, 09h
  55.         mov        dx, buf
  56.         int        21h
  57.        
  58.         mov        ax, 4c00h
  59.         int        21h
  60. code ends
  61. end start
复制代码


需要用 tc 编译 Funs.c




表示字符串结束 */
        buf = str_end_flag;
       
        --i;        /* 指向最后一个字符 */
        max = i / 2;
        for(j = 0; j <= max; ++j)
        {
                Swap(&buf[j], &buf);
                --i;
        }
}
[/code]



                ; 字符串结束标志
        push        ax
        mov        ax, 123
        push        ax
        mov        ax, buf
        push        ax
        call        _NumberToString
        add        sp, 6
       
        ; DS:DX=待输出字符的地址
        mov        ah, 09h
        mov        dx, buf
        int        21h
       
        mov        ax, 4c00h
        int        21h
code ends
end start
[/code]

需要用 tc 编译 Funs.c




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

使用道具 举报

发表于 2018-6-17 07:48:22 | 显示全部楼层
忘了截图 ^_^

无标题.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-17 11:04:31 | 显示全部楼层
发现 bug
@小甲鱼
360截图18231130565468.png
new 1.zip (838 Bytes, 下载次数: 0)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-17 11:07:21 | 显示全部楼层
这4个文件
无标题1.png
Res.zip (13.67 KB, 下载次数: 1)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-6-17 13:15:53 | 显示全部楼层
人造人 发表于 2018-6-17 07:46
偷个懒,用C语言写个转换函数 ^_^

请问你这是在汇编里面写了c函数,然后结果保存在字符串中输出吗???
那结果的进制转换做了吗?
rem = value % 10;
value /= 10;
buf[i++] = rem + '0';
如果这是进制转换的话,为什么二进制转十进制要除以十取余呢?
还有rem应该是int型数据,可以跟字符‘0’相加吗??
麻烦了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-17 13:33:57 | 显示全部楼层    本楼为最佳答案   
444lzx 发表于 2018-6-17 13:15
请问你这是在汇编里面写了c函数,然后结果保存在字符串中输出吗???
那结果的进制转换做了吗?
rem = ...

这个程序是C语言和汇编语言混合编程,由汇编语言调用C语言写的函数
什么是二进制?什么是十进制?什么是十六进制?
数字在内存中就只是一个数字,看你的需求,你可以认为这个数字是十六进制(基数是16),也可以认为是十进制(基数是10),或是二进制(基数是2)
请自己复习进制转换部分

字符在内存中就是一个数字
如果是数字 3 想要显示,那就需要把数字 3 转换成字符 '3'
字符 '0' 是 0x30
字符 '3' 是 0x33
3 + 0x30 = 0x33
数字 3 加字符 '0' 等于字符 '3'
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-17 13:35:06 | 显示全部楼层
你需要下载这几个文件,上面的排版出 bug 了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-6-17 14:30:27 | 显示全部楼层
人造人 发表于 2018-6-17 13:35
你需要下载这几个文件,上面的排版出 bug 了

好的谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-29 14:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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