飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 4540|回复: 6

[C/C++] asm16 显示长整形 123456789

[复制链接]

该用户从未签到

发表于 2011-1-4 18:04:04 | 显示全部楼层 |阅读模式
; 写的比较仓促 仅供参考

  1. assume cs:code

  2. data segment
  3. dd 123456789
  4. nstr db 10h dup (0)
  5. data ends

  6. stack segment
  7. dw 100h dup (0)
  8. stack ends

  9. code segment

  10. _end:  mov ax,4c00h
  11.        int 21h

  12. ; 除法溢出函数
  13. ; 调用该函数前请自行保存 si
  14. ; 除数 ax,dx / 被除数 cx  
  15. ; 余数保存到:si  
  16. div_over:
  17.         xor si,si
  18.         test dx,dx
  19.         jz _div
  20.         push ax
  21.         mov ax,dx
  22.         xor dx,dx
  23.         div cx
  24.         mov si,ax
  25.         pop ax
  26. _div:
  27.         div cx
  28.         push dx
  29.         mov dx,si
  30.         pop si
  31.         retn

  32. ; 整形转字符串
  33. ; 参数:字符保存位置,低16位,高16位
  34. ntostr:
  35.         push bp
  36.         mov bp,sp
  37.         push cx
  38.         push dx
  39.         push bx
  40.         push si

  41.         xor cx,cx
  42.         mov ax,[bp+8]
  43.         mov dx,[bp+6]

  44. n_next:
  45.         push cx
  46.         mov cx,0ah
  47.         call div_over

  48.         pop cx
  49.         inc cx
  50.         add si,30h
  51.         push si

  52.         test dx,dx
  53.         jnz n_next
  54.         test ax,ax
  55.         jnz n_next

  56.         mov bx,[bp+4]
  57.         xor si,si
  58. n_addstr:
  59.         pop ax
  60.         mov [bx+si],al
  61.         inc si
  62.         loop n_addstr
  63.         mov byte ptr [bx+si],0  ; thanks ngm20

  64.         pop si
  65.         pop bx
  66.         pop dx
  67.         pop cx
  68.         mov sp,bp
  69.         pop bp
  70.         retn

  71. ; 显示字符串
  72. ; 参数:字符串地址,字符位置
  73. show_str:
  74.         push bp
  75.         mov bp,sp
  76.         push si
  77.         push di
  78.         push bx

  79.         mov al,[bp+7]
  80.         mov cl,80*2
  81.         mul cl
  82.         mov si,ax
  83.         xor ax,ax
  84.         mov al,[bp+6]
  85.         add ax,ax
  86.         add si,ax

  87.         mov ax,0b800h
  88.         mov es,ax
  89.         mov bx,[bp+4]
  90.         xor di,di
  91.         mov ah,2
  92. s_add:
  93.         mov al,[bx+di]
  94.         test al,al
  95.         jz s_over
  96.         mov es:[si],ax
  97.         inc di
  98.         add si,2
  99.         jmp s_add
  100. s_over:
  101.         pop bx
  102.         pop di
  103.         pop si
  104.         mov sp,bp
  105.         pop bp
  106.         retn


  107. start:  jmp _start
  108.         db 'Code By: Nisy/PYG ',0
  109. _start:
  110.         mov ax,data
  111.         mov ds,ax
  112.         mov ax,stack
  113.         mov ss,ax
  114.         mov sp,200h
  115.         
  116. ; 将整形转化为字符串 保存到nstr中
  117.         xor bx,bx
  118.         mov ax,[bx]
  119.         push ax
  120.         lea bx,[bx+2]
  121.         mov ax,[bx]
  122.         push ax
  123.         lea ax,nstr
  124.         push ax

  125.         call ntostr
  126.         add sp,6

  127. ; 显示nstr的数值
  128.         mov ax,0a0ah
  129.         push ax
  130.         lea ax,nstr
  131.         push ax
  132.         call show_str
  133.         add sp,4
  134. ; 程序结束
  135.         jmp _end

  136. code ends

  137. end start

复制代码
ntostr.jpg

评分

参与人数 1威望 +4 收起 理由
ngm20 + 4

查看全部评分

PYG19周年生日快乐!

该用户从未签到

发表于 2011-1-4 18:06:42 | 显示全部楼层
本帖最后由 Finder 于 2011-1-7 10:27 编辑

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

..............................
  1.      divcx        proc                  ;参数传递用dx:ax
  2.            mov  bp,sp
  3.            sub  sp,20h
  4.         push  bp
  5.         mov  bp,sp
  6.         add  bp,2
  7.         push cx
  8.         push bx
  9.         push si
  10.         push  bp
  11. ;以上初始化       
  12.         mov   cx,0ah
  13.         mov   si,0
  14.         call  ntostr
  15.         nop
  16.         pop        bx
  17.         dec        bx
  18. ;设传递字节的结束偏移地址
  19.                 add  bp,si
  20.                 dec  bp
  21.                 mov  si,offset chr
  22.         _movsb:        mov  al,[bp]
  23.                 mov  byte ptr ds:[si],al
  24.                 inc  si
  25.                 dec  bp
  26.                 cmp  bp,bx
  27.                 jnz  _movsb
  28.                 mov  byte ptr ds:[si],24h   ;设置显示字符串结束标识
  29.                 pop  si
  30.                 pop  bx
  31.                 pop  cx
  32.                 pop  ax
  33.                 mov  sp,ax                  ;平衡堆栈
  34.                 retn

  35. ntostr:        test      dx,dx
  36.            jz        _div1
  37.            push        ax
  38.            mov        ax,dx
  39.            xor        dx,dx
  40.            div        cx
  41.            mov        bx,ax
  42.            pop        ax
  43. _div1:     div        cx
  44.            add        dx,30h   
  45.            mov        [bp+si],dx                ;将余数+30h存放在临时变量中
  46.            inc        si
  47.            mov        dx,bx
  48.            test        ax,ax       
  49.            jnz        ntostr
  50.            retn
  51. ;--------------------------------

  52. divcx        endp
复制代码
PYG19周年生日快乐!

该用户从未签到

发表于 2011-1-4 18:20:14 | 显示全部楼层
xor bx,bx
        mov ax,[bx]
        push ax
        lea bx,[bx+2]
        mov ax,[bx]
这段好绕人啊,N大这样写是为了减小机器码长度?
PYG19周年生日快乐!

该用户从未签到

 楼主| 发表于 2011-1-4 18:24:42 | 显示全部楼层
lea bx,[bx+2]
mov ax,[bx]   //等价于 mov ax,[BX+2]  这里用 lea 做了一个加法 小把戏
PYG19周年生日快乐!

该用户从未签到

发表于 2011-1-4 18:49:13 | 显示全部楼层
ntostr子程序 对栈和cx的应用很精彩:lol:

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

该用户从未签到

 楼主| 发表于 2011-1-4 19:41:56 | 显示全部楼层
想到一块了 我打算晚上视频加呢 O(∩_∩)O~
PYG19周年生日快乐!
  • TA的每日心情
    开心
    2024-3-7 15:25
  • 签到天数: 442 天

    [LV.9]以坛为家II

    发表于 2011-1-5 12:10:56 | 显示全部楼层
    74行没加 mov [bx+si],0 作为结束的标志而且程序能正常运行,是因为一开始 nstr db 10h dup (0)
    正好是定义的0,所以 108 109行正常运行。
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

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