写了半个晚上,终于写出来了, 理解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
- [chervy] 我还是初学汇编的。 我学着弄了一遍,接下来怎么弄呢?谢谢。 09/17 17:24
- [ghi] 先收藏了 以后再看 哈哈 好东西都得看见就收藏了 07/02 22:06
- [wuerlang] 我也收藏. 也许用来研究学习汇编的时候有用. 至于研究病毒,倒不觉得有什么兴趣. 12/25 17:24
- [happy] 学习了! 10/22 20:19
- [happy] 厉害! 10/22 20:07
- [happy] 不错,支持一下 10/22 20:05
- [goal00001111] 很不错,收藏了。 10/21 12:51
- [dreamhk] 博主可否把病毒文件加密码virus压缩发送到 rar.virus@gmail.com 谢谢,我没有 10/20 21:27
- [jyycool] 呵呵,不错强啊,我还不行,我想最多半个月,我就可以看的懂了 10/20 19:48