如何在vs2015下寫匯編,呼叫stdio庫的函式呢?
uj5u.com熱心網友回復:
為嘛要這么搞?uj5u.com熱心網友回復:
因為寫了一個檔案,然后在vs2013下可以運行但是在2015和2017下就不能運行了,在代碼中用到了print是stdio庫中的,已經有msvcrt.lib了,但是目前不能用uj5u.com熱心網友回復:
源代碼用vs2015重新編譯。uj5u.com熱心網友回復:
試過了,不可以,我自己寫的那個檔案,放到了/vc/include 下,然后在代碼中包含了我的那個檔案,其實就是想用stdio的print,但是放到2015和2017中還是不行,2010和2013都可以uj5u.com熱心網友回復:
你用匯撰寫的檔案?呼叫了print函式?uj5u.com熱心網友回復:
; vcIO.inc declarations for standard I/O ,console I/O Function prototypes; Copyright (c) FCL 2010. All rights reserved.
.686
.model flat,stdcall
option casemap:none ;case sensitive
; =======================================================================
; 匯編語言可以呼叫C/C++語言所有的庫函,只要對C語言庫函式的原型進行說明就可以。
includelib msvcrt.lib ; C語言中的 stdio.h conio.h 的運行時庫
; C Run-Time Libraries (CRT)
; C語言I/O庫函式的原型說明
; Function prototypes
printf PROTO C : dword,:vararg ;vararg引數:變參,引數個數不確定
scanf PROTO C : dword,:vararg ;dword引數 :格式描述串的有效地址。
_getch PROTO C : vararg ;注意:所有的引數都是dword型!
_kbhit PROTO C : vararg
; =======================================================================
這是寫成了.inc 檔案,然后代碼中是
; Template for Win32 Console Application,2008
include vcIO.inc
.data ;set data segment
hello byte 'Hello MAS32',0 ;字串
frmStr byte '%s',0ah,0 ;顯示字串的格式描述串,0ah:“\n”
.code
main proc
pushad ;保護8個通用暫存器
invoke printf,offset frmStr,offset hello ;顯示字串
popad ;恢復8個通用暫存器
ret ;return to windows
main endp
; (insert additional procedures here)
end main ;end of assembly
uj5u.com熱心網友回復:
是因為你用的庫不對,從VC++ 2015開始,標準庫的部分函式被改成了inline函式,所以libcmt.lib、msvcrt.lib中就沒有這些函式的符號了,從匯編代碼中呼叫這些庫函式就會出現Unresolved external symbol xxx referenced in function ...解決也很簡單,使用老版本的庫,比如masm32自帶的msvcrt.lib,或者用VC++帶的dumpbin.exe、lib.exe自己從對應的dll生成匯入庫。
uj5u.com熱心網友回復:
;//VS15/17 Template for Win32 Console Application.686
.MODEL flat, stdcall
option casemap : none
includelib ucrt.lib
includelib msvcrt.lib
; Function prototypes
puts PROTO C : dword
printf PROTO C : dword,:vararg
.data
Hello byte "hello",10, 0
.code
main proc
invoke puts,offset Hello
;invoke printf, offset Hello
ret
main endp
end main
代碼包含了msvcrt.lib 或者 msvcrtd.lib之后print都沒有辦法運行,你說的那個我了解到了,但是我還是不懂該怎么解決。
uj5u.com熱心網友回復:
謝謝各位大佬,我已經找到了解決的辦法了;//VS15/17 Template for Win32 Console Application
.686
.MODEL flat, stdcall
option casemap : none
includelib ucrt.lib
includelib legacy_stdio_definitions.lib
; Function prototypes
printf PROTO C : dword,:vararg
_getch PROTO C : vararg
.data
Hello byte "hello",10, 0
.code
main proc
invoke printf, offset Hello
invoke _getch
ret
main endp
end main
用這樣的方式,同時包含這兩個.lib就可以了
uj5u.com熱心網友回復:
實測直接用masm32里的msvcrt.lib是可以的,生成.exe 3KB,你這樣也可以,只是生成的.exe大一些,4KB。轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/49172.html
標籤:基礎類
上一篇:求大神指教這該怎么改?
