鱼C论坛

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

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

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

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

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

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

在小甲鱼第八章视频中,讲到用div指令计算100001除以100,商存在ax中,debug查看其结果是03e8。现在我想用dos的2号指令将这个结果以十进制形式输出,该怎么做呢?
前面的代码大概是这样的:
data segment
        dd 100001
        dw 100
        dw 0
data ends
assume cs:code,ds:data        
code segment
start:
        mov ax,data 
        mov ds,ax
        mov ax,ds:[0]
        mov dx,ds:[2]
        div word ptr ds:[4]
code ends
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语言写个转换函数 ^_^
assume cs:code, ds:data, ss:stack

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

stack segment
        db 1024 dup(?)
stack ends

data segment
buf:
        db 1024 dup(?)
        
data ends

code segment
start:
        mov        ax, stack
        mov        ss, ax
        mov        sp, 1024
        mov        ax, data
        mov        ds, ax
        
        mov        ax, '

需要用 tc 编译 Funs.c
[code]static void Swap(char *a, char *b)
{
        char t = *a;
        *a = *b;
        *b = t;
}

void far NumberToString(char *buf, int value, char str_end_flag)
{
        int i = 0;
        int j;
        int max;
        int rem;
        
        while(value != 0)
        {
                rem = value % 10;
                value /= 10;
                buf[i++] = rem + '0';
        }
        
        /* 字符串结束标志,dos 比较奇怪,不使用 '\0',使用 '








Funs.zip

(1.16 KB, 下载次数: 0)





                ; 字符串结束标志
        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

需要用 tc 编译 Funs.c




表示字符串结束 */
        buf[i] = str_end_flag;
       
        --i;        /* 指向最后一个字符 */
        max = i / 2;
        for(j = 0; j <= max; ++j)
        {
                Swap(&buf[j], &buf[i]);
                --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-10-6 03:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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