这两天进展不顺,被卡住了!等搞清楚再继续,就把调试的时候写的两个函数贴上来凑数吧。——win7下貌似没有debug,有也不爱用,业余屌丝还是比较中意在代码执行的时候直接输出中间值来查错。
第一个函数是提示字符串的:
; ---------------------------------------------------------------------------------------- ; 功能:显示紧跟在调用指令后定义的字符串 ; 参数:ds : si = 字符串地址 ; 反值:无 PrintMessage: ; 初始化中断参数 mov ah, 0x0e ; 功能号:0x0E 显示字符,光标跟随字符移动 xor bx, bx ; bh = 页码,bl = 前景色(图形模式) .Loop: ; 逐个取字符 pop si lodsb cmp al, 0 ; 字符串以 0 结尾 je .Return push si int 0x10 jmp .Loop .Return: ret
这个很好用,不用预先定义字符串,要用的时候直接在 call 下一行定义字符串就行:
call PrintMessage db "Message 1 !", `\r\n`, 0
第二个是显示数字的——把数字当字符串显示:
; 功能:将 32 位整数以字符形式显示到屏幕 ; 参数: eax = 数据 ; 返回:无 PrintNum: mov ecx, 0 push ecx ; 求余,把对应的数字转换成ASCII码,再压入栈 mov ecx, 10 .rem: xor edx, edx div ecx add edx, 0x30 ; 余数转成 ASCII 码 push edx cmp eax, 0 jnz .rem mov ah, 0x0e ; 功能号:0x0E 显示字符,光标跟随字符移动 xor bx, bx .print: pop ecx jcxz .return inc edi mov al, cl int 0x10 jmp .print .return: ret
有了这个不用在 debug 里找变量中间值了!
原文:http://my.oschina.net/u/580100/blog/528663