sdnyzjzx 发表于 2011-1-6 19:04:39

学完视频18 再写一次 dtoc 1234567890

学习了第18个视频,思路有所进步,再写一遍这个代码,比原来思路清楚多了。代码中与视频中不同一点:没有把转化成的字符先压入堆栈,而是直接放到了 _save_c 数据段,显示的时候从后向前显示。
第一次代码地址: https://www.chinapyg.com/viewthread.php?tid=60715assume cs:code

stack segment
        dw 100 dup(0)
stack ends

data segment
        _num        dd 1234567890
        _save_c dw 20h dup(0)
data ends

code segment

_div:       
        xor si,si        ;必须清0,因为下面 _div_2 里面还要把 si 值放到 dx 里面
        test dx,dx        ;测试高16位是否为 0
        jz _div_2
        push ax
        mov ax,dx
        xor dx,dx
        div cx
        mov si,ax
        pop ax

_div_2:                        ;低16位做除法
        div cx
        push dx
        mov dx,si        ;上面 si 不清0 ,这里当 dx 为0时,si 的内容就会赋值给 dx,结果就错了
        pop si
        retn
;显示字符串       
_show:                        ;初始化显示
        mov ax,0b800h
        mov es,ax
        mov si,12*160+20*2
        mov bx,offset _save_c
        mov cx,di
        inc cx                ;加1因为 cx=0 时就不显示了,而在 _save_c 偏移0位置还有数据
_t:                        ;显示
        mov ax,
        mov ah,6        ;颜色
        mov es:,ax
        add si,2
        dec di
        loop _t
        retn
;程序结束
_over:
        mov ax,4c00h
        int 21h

start:
        mov ax,data
        mov ds,ax
        mov ax,stack
        mov ss,ax
        mov sp,200h
        mov si,0
        mov di,0
        mov cx,10

        mov bx,offset _num
        mov ax,
        mov dx,

_s:        call _div
        mov bx,offset _save_c
        add si,30h
        push cx
        mov cx,si
        mov ,cl
        pop cx
        inc di
        test dx,dx
        jnz _s
        test ax,ax
        jnz _s
        call _show
        jmp _over

code ends
end start

doudou8308 发表于 2011-2-19 22:08:39

              

支持关注中!











http://www.discuz.net/static/image/common/sigline.gif
燃文

qifeng09 发表于 2011-3-21 00:55:25

楼主很有想法
页: [1]
查看完整版本: 学完视频18 再写一次 dtoc 1234567890