444lzx 发表于 2018-6-16 23:15:21

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

本帖最后由 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:
        mov dx,ds:
        div word ptr ds:
code ends
end start

人造人 发表于 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
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 = rem + '0';
        }
       
        /* 字符串结束标志,dos 比较奇怪,不使用 '\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
[        DISCUZ_CODE_1        ]



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




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



人造人 发表于 2018-6-17 07:48:22

忘了截图 ^_^

人造人 发表于 2018-6-17 11:04:31

发现 bug
@小甲鱼


人造人 发表于 2018-6-17 11:07:21

这4个文件

444lzx 发表于 2018-6-17 13:15:53

人造人 发表于 2018-6-17 07:46
偷个懒,用C语言写个转换函数 ^_^




请问你这是在汇编里面写了c函数,然后结果保存在字符串中输出吗???
那结果的进制转换做了吗?
rem = value % 10;
value /= 10;
buf = rem + '0';
如果这是进制转换的话,为什么二进制转十进制要除以十取余呢?
还有rem应该是int型数据,可以跟字符‘0’相加吗??
麻烦了

人造人 发表于 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'

人造人 发表于 2018-6-17 13:35:06

你需要下载这几个文件,上面的排版出 bug 了

444lzx 发表于 2018-6-17 14:30:27

人造人 发表于 2018-6-17 13:35
你需要下载这几个文件,上面的排版出 bug 了

好的谢谢
页: [1]
查看完整版本: 小甲鱼入门学习汇编第八章div后的数字输出问题