![]() |
#2
obstratiker2011-07-01 10:57
|

;MASMPlus 代码模板 - 控制台程序
.386
.model flat, stdcall
option casemap :none
include windows.inc
include user32.inc
include kernel32.inc
include masm32.inc
include gdi32.inc
includelib gdi32.lib
includelib user32.lib
includelib kernel32.lib
includelib masm32.lib
include macro.asm
IntegerToString PROTO int32:DWORD, str_ptr:PTR BYTE
.data
lpMsg BYTE 10 dup('0'),0
.data?
buffer db MAX_PATH dup(?)
.CODE
START:
mov eax,5
add eax,6
invoke IntegerToString,eax,addr lpMsg
invoke locate,2,2 ;设定输出文本的坐标
invoke StdOut,offset lpMsg
;暂停显示,回车键关闭
invoke StdIn,addr buffer,sizeof buffer
invoke ExitProcess,0
end START
;------------------------------------------------------
IntegerToString PROC USES eax ecx edx esi,
int32:DWORD,str_ptr:PTR BYTE
;
;把二进制表示的整数转换成相应的字符串
;Receives: int32=32位无符号整数,str_ptr=指向输出字符串地址的指针
;Return: str_ptr=指向输出字符串地址的指针
------------------------------------------------------
mov edx,int32 ;save eax
mov esi,9
mov ecx,10
label_next:
mov edx,eax
and al,0fh ;分离al低4位
shl edx,4 ;消除edx低4位
cmp al,9 ;al<=9?
jbe label_small ;是:跳转
inc edx ;否:进位
label_small:
add al,6 ;分离
add al,30h
mov str_ptr[esi],al ;传送到指定字符串
inc esi ;指向前一个字符
loop label_next ;转换前一位
ret
IntegerToString ENDP
主要问题出在对IntegerToString过程的调用,如果我把 invoke IntegerToString,eax,addr lpMsg 这一句注释掉之后编译通过.386
.model flat, stdcall
option casemap :none
include windows.inc
include user32.inc
include kernel32.inc
include masm32.inc
include gdi32.inc
includelib gdi32.lib
includelib user32.lib
includelib kernel32.lib
includelib masm32.lib
include macro.asm
IntegerToString PROTO int32:DWORD, str_ptr:PTR BYTE
.data
lpMsg BYTE 10 dup('0'),0
.data?
buffer db MAX_PATH dup(?)
.CODE
START:
mov eax,5
add eax,6
invoke IntegerToString,eax,addr lpMsg
invoke locate,2,2 ;设定输出文本的坐标
invoke StdOut,offset lpMsg
;暂停显示,回车键关闭
invoke StdIn,addr buffer,sizeof buffer
invoke ExitProcess,0
end START
;------------------------------------------------------
IntegerToString PROC USES eax ecx edx esi,
int32:DWORD,str_ptr:PTR BYTE
;
;把二进制表示的整数转换成相应的字符串
;Receives: int32=32位无符号整数,str_ptr=指向输出字符串地址的指针
;Return: str_ptr=指向输出字符串地址的指针
------------------------------------------------------
mov edx,int32 ;save eax
mov esi,9
mov ecx,10
label_next:
mov edx,eax
and al,0fh ;分离al低4位
shl edx,4 ;消除edx低4位
cmp al,9 ;al<=9?
jbe label_small ;是:跳转
inc edx ;否:进位
label_small:
add al,6 ;分离
add al,30h
mov str_ptr[esi],al ;传送到指定字符串
inc esi ;指向前一个字符
loop label_next ;转换前一位
ret
IntegerToString ENDP
[ 本帖最后由 八画小子 于 2011-6-28 16:48 编辑 ]