在汇编语言调用c语言程序,C/C++调用汇编语言实例:目录表程序

现在编写一个简短的程序,清除屏幕,显示当前磁盘目录,并请求用户输入文件名。程序员可能希望扩展该程序,以打开并显示被选中文件。

C++ 根模块

C++ 模块只有一个对 asm_main 的调用,因此可以将其称为根模块 (stub module):

// main.cpp

//根模块:启动汇编程序

extern "C" void asm_main() ; // asm 启动过程

void main()

{

asm_main();

}

ASM 模块

汇编语言模块包括了函数原型、若干字符串和一个 fileName 变量。模块两次调用 system 函数,向其传递“cls”和“dir”命令。然后调用 printf,显示请求文件名的提示行,再调用 scanf,使用户输入文件名。

程序不调用 Irvine32 库中的任何函数,因此可以将 .MODEL 伪指令设置为 C 语言规范:

; 从 C++ 启动的 ASM 程序 (asmMain.asm)

.586

.MODEL flat,C

; 标准 C 库函数

system PROTO, pCommand:PTR BYTE

printf PROTO, pString:PTR BYTE, args:VARARG

scanf PROTO, pFormat:PTR BYTE,pBuffer:PTR BYTE, args:VARARG

fopen PROTO, mode:PTR BYTE, filename:PTR BYTE

fclose PROTO, pFile:DWORD

BUFFER_SIZE = 5000

.data

str1 BYTE "cls",0

str2 BYTE "dir/w",0

str3 BYTE "Enter the name of a file: ",0

str4 BYTE "%s",0

str5 BYTE "cannot open file",0dh,0ah,0

str6 BYTE "The file has been opened and closed",0dh,0ah,0

modeStr BYTE "r",0

fileName BYTE 60 DUP(0)

pBuf DWORD ?

pFile DWORD ?

.code

asm_main PROC

; 清除屏幕,显示磁盘目录

INVOKE system,ADDR str1

INVOKE system,ADDR str2

; 清除文件名

INVOKE printf,ADDR str3

INVOKE scanf, ADDR str4, ADDR fileName

; 尝试打开文件

INVOKE fopen, ADDR fileName, ADDR modeStr

mov pFile,eax

.IF eax == 0 ; 不能打开文件

INVOKE printf,ADDR str5

jmp quit

.ELSE

INVOKE printf,ADDR str6

.ENDIF

; 关闭文件

INVOKE fclose, pFile

quit:

ret ; 返回 C++ 主程序

asm_main ENDP

END

函数 scanf 需要两个参数:第一个是格式化字符串(“%s”)的指针,第二个是输入字符串变量(fileName)的指针。因为互联网上有丰富的文档,因此这里不再浪费时间来解释标准 C 函数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值