汇编网首页登录博客注册
mnzn2530的学习博客
博客首页博客互动【做检测题】论坛求助

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  

[2007-10-22 16:30] miniprintf

写了半个晚上,终于写出来了, 理解printf函数, 你需要知道一个程序的堆栈是如何分布的, 以前看别人写, 现在我也有信心写自己的printf,虽然功能很弱,但是已经够我用了, 不过我还没加%d的处理, 有空再加吧, 写完这个我不得不提醒自己:注意你的堆栈!!!
采用的是  __cdecl 调用方式

assume cs:code, ds:data, ss:stack

stack segment
    dw 100H dup (0)
stack ends

data segment
    msg db "this is a %s, caracter %c %c %c", 0
    chara db 'abc'
    number dw 1234D
    str db "a string", 0
data ends
    
code segment
main proc
start:
    mov ax, data
    mov ds, ax
    lea bx, msg

    mov ax, stack
    mov ss, ax
    mov sp, 100H
    
    xor ax, ax
    mov al, chara[2]
    push ax
    mov al, chara[1]
    push ax
    mov al, chara
    push ax
    lea ax, str
    push ax
    
    push bx
    call myprint

    add sp, 8

    xor ax, ax
    int 16H
    
    mov ax, 4c00H
    int 21H
main endp
    
myprint proc
    jmp printbegin
    enter db 0dH, 0aH, '$'
printbegin:    
    push bp
    mov bp, sp
    
    mov ax, 0b800H
    mov es, ax
    mov di, 0
    
    add bp, 4
    mov bx, 0
    mov si, [bp]
    add bp, 2
s:
    xor ax, ax
    mov al, [si+bx]
    cmp al, 0
    je pend

    cmp al, '\'
    jne change
    inc si
    inc si
    push ds
    push dx
    mov ax, SEG enter
    mov ds, ax
    lea dx, enter
    xor ax, ax
    mov ah, 9H
    int 21H
    pop dx
    pop ds
    jmp s
change:    
    cmp al, '%'
    jne caraect 
    inc bx
    mov al, [si+bx]
    cmp al, 'd'
    je digit
    
    cmp al, 'c'
    je char
    
    cmp al, 's'
    je string

caraect:    
    mov es:[di], al
    jmp over
digit:
    inc bx            ; 数字暂未处理
    
char:
    inc bx
    mov ax, [bp]
    add bp, 2
    mov es:[di], al
    add di, 2
    jmp s            ; 字符处理结束
    
string:
    inc bx
    push bx
    push cx
    push si
    xor bx, bx
    xor cx, cx
    xor si, si
    mov bx, [bp]
    add bp, 2
stloop:
    mov cl, [bx+si]
    jcxz strend
    mov es:[di], cl
    add di, 2
    inc si
    jmp stloop
    
strend:
    pop si
    pop cx
    pop bx
    jmp s            ; 字符串处理结束
    
over:
    add di, 2
    inc bx
    jmp s
pend:    
    pop bp
    
    ret
code ends
end start
评论次数(1)  |  浏览次数(949)  |  类型(默认类型) |  收藏此文  | 

[  happy   发表于  2007-10-22 20:05  ]

不错,支持一下

 
 请输入验证码  (提示:点击验证码输入框,以获取验证码