QQ登录

只需要一步,快速开始

APP扫码登录

只需要一步,快速开始

手机号码,快捷登录

泡泡马甲APP 更多内容请下载泡泡马甲手机客户端APP 立即下载 ×
查看: 1337|回复: 0

[C/C++/Qt] C/C++调用汇编语言实例:目录表程序

[复制链接]

等级头衔

积分成就    金币 : 2810
   泡泡 : 1516
   精华 : 6
   在线时间 : 1245 小时
   最后登录 : 2024-5-17

丰功伟绩

优秀达人突出贡献荣誉管理论坛元老

联系方式
发表于 2022-10-4 19:29:27 | 显示全部楼层 |阅读模式
       现在编写一个简短的程序,清除屏幕,显示当前磁盘目录,并请求用户输入文件名。程序员可能希望扩展该程序,以打开并显示被选中文件。$ T/ b6 O( Z7 ~3 Y* G$ S& \0 L  a0 d
一、C++ 根模块
! E! W0 v! u% Z* l       C++ 模块只有一个对 asm_main 的调用,因此可以将其称为根模块 (stub module):
0 @7 V0 z8 r; s. |2 f
  1. // main.cpp
  2. //根模块:启动汇编程序
  3. extern "C" void asm_main() ; // asm 启动过程
  4. void main()
  5. {
  6.     asm_main();
  7. }
二、ASM 模块
6 t4 V  K2 q) n. m       汇编语言模块包括了函数原型、若干字符串和一个 fileName 变量。模块两次调用 system 函数,向其传递“cls”和“dir”命令。然后调用 printf,显示请求文件名的提示行,再调用 scanf,使用户输入文件名。' K! ]/ [" x9 }0 L9 V4 ]
       程序不调用 Irvine32 库中的任何函数,因此可以将 .MODEL 伪指令设置为 C 语言规范:# |- M% x& F' N4 S- _  q& F
  1. ; 从 C++ 启动的 ASM 程序 (asmMain.asm)
  2. .586
  3. .MODEL flat,C
  4. ; 标准 C 库函数
  5. system PROTO, pCommand:PTR BYTE
  6. printf PROTO, pString:PTR BYTE, args:VARARG
  7. scanf  PROTO, pFormat:PTR BYTE,pBuffer:PTR BYTE, args:VARARG
  8. fopen  PROTO, mode:PTR BYTE, filename:PTR BYTE
  9. fclose PROTO, pFile:DWORD
  10. BUFFER_SIZE = 5000
  11. .data
  12. str1 BYTE "cls",0
  13. str2 BYTE "dir/w",0
  14. str3 BYTE "Enter the name of a file: ",0
  15. str4 BYTE "%s",0
  16. str5 BYTE "cannot open file",0dh,0ah,0
  17. str6 BYTE "The file has been opened and closed",0dh,0ah,0
  18. modeStr BYTE "r",0
  19. fileName BYTE 60 DUP(0)
  20. pBuf  DWORD ?
  21. pFile DWORD ?
  22. .code
  23. asm_main PROC
  24.     ; 清除屏幕,显示磁盘目录
  25.     INVOKE system,ADDR str1
  26.     INVOKE system,ADDR str2
  27.    
  28.     ; 清除文件名
  29.     INVOKE printf,ADDR str3
  30.     INVOKE scanf, ADDR str4, ADDR fileName
  31.     ; 尝试打开文件
  32.     INVOKE fopen, ADDR fileName, ADDR modeStr
  33.     mov pFile,eax
  34.     .IF eax == 0                ; 不能打开文件
  35.       INVOKE printf,ADDR str5
  36.       jmp quit
  37.     .ELSE
  38.       INVOKE printf,ADDR str6
  39.     .ENDIF
  40.     ; 关闭文件
  41.     INVOKE fclose, pFile
  42. quit:
  43.     ret                         ; 返回 C++ 主程序
  44. asm_main ENDP
  45. END
      函数 scanf 需要两个参数:第一个是格式化字符串(“%s”)的指针,第二个是输入字符串变量(fileName)的指针。因为互联网上有丰富的文档,因此这里不再浪费时间来解释标准 C 函数。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|paopaomj.COM ( 渝ICP备18007172号 )

GMT+8, 2024-5-18 01:34

Powered by paopaomj X3.4 © 2016-2024 sitemap

快速回复 返回顶部 返回列表