Nisy 发表于 2011-1-4 18:04:04

asm16 显示长整形 123456789

; 写的比较仓促 仅供参考
assume cs:code

data segment
dd 123456789
nstr db 10h dup (0)
data ends

stack segment
dw 100h dup (0)
stack ends

code segment

_end:mov ax,4c00h
       int 21h

; 除法溢出函数
; 调用该函数前请自行保存 si
; 除数 ax,dx / 被除数 cx
; 余数保存到:si
div_over:
      xor si,si
      test dx,dx
      jz _div
      push ax
      mov ax,dx
      xor dx,dx
      div cx
      mov si,ax
      pop ax
_div:
      div cx
      push dx
      mov dx,si
      pop si
      retn

; 整形转字符串
; 参数:字符保存位置,低16位,高16位
ntostr:
      push bp
      mov bp,sp
      push cx
      push dx
      push bx
      push si

      xor cx,cx
      mov ax,
      mov dx,

n_next:
      push cx
      mov cx,0ah
      call div_over

      pop cx
      inc cx
      add si,30h
      push si

      test dx,dx
      jnz n_next
      test ax,ax
      jnz n_next

      mov bx,
      xor si,si
n_addstr:
      pop ax
      mov ,al
      inc si
      loop n_addstr
      mov byte ptr ,0; thanks ngm20

      pop si
      pop bx
      pop dx
      pop cx
      mov sp,bp
      pop bp
      retn

; 显示字符串
; 参数:字符串地址,字符位置
show_str:
      push bp
      mov bp,sp
      push si
      push di
      push bx

      mov al,
      mov cl,80*2
      mul cl
      mov si,ax
      xor ax,ax
      mov al,
      add ax,ax
      add si,ax

      mov ax,0b800h
      mov es,ax
      mov bx,
      xor di,di
      mov ah,2
s_add:
      mov al,
      test al,al
      jz s_over
      mov es:,ax
      inc di
      add si,2
      jmp s_add
s_over:
      pop bx
      pop di
      pop si
      mov sp,bp
      pop bp
      retn


start:jmp _start
      db 'Code By: Nisy/PYG ',0
_start:
      mov ax,data
      mov ds,ax
      mov ax,stack
      mov ss,ax
      mov sp,200h
      
; 将整形转化为字符串 保存到nstr中
      xor bx,bx
      mov ax,
      push ax
      lea bx,
      mov ax,
      push ax
      lea ax,nstr
      push ax

      call ntostr
      add sp,6

; 显示nstr的数值
      mov ax,0a0ah
      push ax
      lea ax,nstr
      push ax
      call show_str
      add sp,4
; 程序结束
      jmp _end

code ends

end start

Finder 发表于 2011-1-4 18:06:42

本帖最后由 Finder 于 2011-1-7 10:27 编辑

站位学习,慢慢消化
学习消化了一下,写完之后看看,和楼主的差距还是很大,继续学习,还是把部分代码贴出来了,
    data segment
        num1dd 987654321
    .....................
    data ends
..............................
         mov bx,offset num1
        mov ax,
        mov dx,
        call divcx

..............................   divcx        proc                  ;参数传递用dx:ax
         movbp,sp
         subsp,20h
        pushbp
        movbp,sp
        addbp,2
        push cx
        push bx
        push si
        pushbp
;以上初始化       
        mov   cx,0ah
        mov   si,0
        callntostr
        nop
        pop        bx
        dec        bx
;设传递字节的结束偏移地址
                addbp,si
                decbp
                movsi,offset chr
        _movsb:        moval,
                movbyte ptr ds:,al
                incsi
                decbp
                cmpbp,bx
                jnz_movsb
                movbyte ptr ds:,24h   ;设置显示字符串结束标识
                popsi
                popbx
                popcx
                popax
                movsp,ax                  ;平衡堆栈
                retn

ntostr:        test      dx,dx
         jz      _div1
         push        ax
         mov        ax,dx
         xor        dx,dx
         div        cx
         mov        bx,ax
         pop        ax
_div1:   div        cx
         add        dx,30h   
         mov        ,dx                ;将余数+30h存放在临时变量中
         inc        si
         mov        dx,bx
         test        ax,ax       
         jnz        ntostr
         retn
;--------------------------------

divcx        endp

ngm20 发表于 2011-1-4 18:20:14

xor bx,bx
      mov ax,
      push ax
      lea bx,
      mov ax,
这段好绕人啊,N大这样写是为了减小机器码长度?

Nisy 发表于 2011-1-4 18:24:42

lea bx,
mov ax,   //等价于 mov ax,这里用 lea 做了一个加法 小把戏

ngm20 发表于 2011-1-4 18:49:13

ntostr子程序 对栈和cx的应用很精彩:lol:

输出字符时判断结束是看该位是否为零
老大在定义nstr db 10h dup (0)全为零,所以实现上肯定没有问题
感觉程序严谨些可以在74行加一句      
mov ,0 作为结束的标志

Nisy 发表于 2011-1-4 19:41:56

想到一块了 我打算晚上视频加呢 O(∩_∩)O~

sdnyzjzx 发表于 2011-1-5 12:10:56

74行没加 mov ,0 作为结束的标志而且程序能正常运行,是因为一开始 nstr db 10h dup (0)
正好是定义的0,所以 108 109行正常运行。
页: [1]
查看完整版本: asm16 显示长整形 123456789