asm 调用c 库函数,该怎么处理
asm 调用c 库函数
cpp
#include<stdio.h>
extern "C" void asmmain();
void main()
{
asmmain();
}
asm
include \masm32\include\SmallWin.inc
printf PROTO C,format:PTR BYTE,args:VARARG
scanf PROTO C,format:PTR BYTE,args:VARARG
asmmain PROTO C
.586
.model flat,C
.code
val dword ?
itip BYTE '输入一个 整数',0dh,0ah,0
scan BYTE '%d',0
otip BYTE '这个数:',0dh,0ah,0
print BYTE '%d',0dh,0ah,0
.code
asmmain PROC C
INVOKE printf, ADDR itip
INVOKE scanf ,ADDR scan, ADDR val
INVOKE printf,ADDR print,val
ret
asmmain ENDP
END
输入完一个数,程序就停止运行了
------解决方案--------------------
你把数据 val 定义在 .code 里?这个段通常是 Read+Execute 属性的,没有 Write ,所以读入数据写入到该变量时访问异常了。还是按常规的来吧,代码在 .code ,初始化的数据在 .data ,非初始化的数据在 .data? ,只有少量非初始化数据的话,也可以合并在 .data 中。
cpp
#include<stdio.h>
extern "C" void asmmain();
void main()
{
asmmain();
}
asm
include \masm32\include\SmallWin.inc
printf PROTO C,format:PTR BYTE,args:VARARG
scanf PROTO C,format:PTR BYTE,args:VARARG
asmmain PROTO C
.586
.model flat,C
.code
val dword ?
itip BYTE '输入一个 整数',0dh,0ah,0
scan BYTE '%d',0
otip BYTE '这个数:',0dh,0ah,0
print BYTE '%d',0dh,0ah,0
.code
asmmain PROC C
INVOKE printf, ADDR itip
INVOKE scanf ,ADDR scan, ADDR val
INVOKE printf,ADDR print,val
ret
asmmain ENDP
END
输入完一个数,程序就停止运行了
------解决方案--------------------
你把数据 val 定义在 .code 里?这个段通常是 Read+Execute 属性的,没有 Write ,所以读入数据写入到该变量时访问异常了。还是按常规的来吧,代码在 .code ,初始化的数据在 .data ,非初始化的数据在 .data? ,只有少量非初始化数据的话,也可以合并在 .data 中。