64位Ubuntu中C與intel彙編混合程式設計

2021-07-10 11:15:33 字數 3402 閱讀 4823

/* test.c */

#include

int main()

asm [volatile](

彙編語句模板

: 輸出部分

: 輸入部分

:破壞描述部分

);

彙編語句模板(assembler template)
輸出部分(output operands)和輸入部分(input operands)
"=r"

(a)

"m"

(n)

*** is

not a valid base/index expression

破壞描述部分
分類

限定符描述

運算元型別

「=」運算元在指令中是只寫的(輸出運算元)

運算元型別

「+」運算元在指令中是讀寫型別的(輸入輸出運算元)

通用暫存器

「a」將輸入變數放入eax

通用暫存器

「b」將輸入變數放入ebx

通用暫存器

「c」將輸入變數放入ecx

通用暫存器

「d」將輸入變數放入edx

通用暫存器

「s」將輸入變數放入esi

通用暫存器

「q」將輸入變數放入eax,ebx,ecx,edx中的乙個

通用暫存器

「r」將輸入變數放入通用暫存器

通用暫存器

「a」把eax和edx合成乙個64 位的暫存器(use long longs)

暫存器或記憶體

「g」將輸入變數放入eax,ebx,ecx,edx中的乙個,或者作為記憶體變數

暫存器或記憶體

「x」運算元可以是任何型別

記憶體「m」

記憶體變數

記憶體「o」

運算元為記憶體變數,但是其定址方式是偏移量型別,也即是基址定址,或者是基址加變址定址

記憶體「v」

運算元為記憶體變數,但定址方式不是偏移量型別

記憶體「p」

運算元是乙個合法的記憶體位址(指標)

立即數「i」

0-31之間的立即數(用於32位移位指令)

立即數「j」

0-63之間的立即數(用於64位移位指令)

立即數「n」

0-255之間的立即數(用於out指令)

立即數「i」

立即數立即數

「n」立即數,有些系統不支援除字以外的立即數,這些系統應該使用「n」而不是「i」

匹配「0」

表示用它限制的運算元與某個指定的運算元匹配

匹配「1」

也即該運算元就是指定的那個運算元,例如「0」匹配&

該輸出運算元不能使用過和輸入運算元相同的暫存器

nasm -f elf64 test-s

.asm

gcc -c test-c

.c

gcc test-s

.o test-c

.o -o test

/* test-c.c */

#include

//引入外部函式

extern

void fun(int, char);

//共享的變數申明必須在主函式外

char buf="test";

int main()

;test-s.asm

;引入c語言中變數

extern buf;

[section .text] ;**段

global

fun ;匯出函式fun

fun:

mov rax, rsi

mov [buf+rdi-1], al

ret

~$ nasm -f elf64 test-s

.asm

~$ gcc -c test-c

.c ~$ gcc test-s

.o test-c

.o -o test

~$ ./test

the old buf is test.

the new buf is teat.

gcc嵌入式彙編簡介

gcc擴充套件內聯彙編

at&t 彙編和 gcc 內聯彙編簡介

gcc下對彙編最好的處理文章_assembly___

gcc內聯彙編函式語法

內聯彙編 - 從頭開始

gcc內聯彙編基礎

gcc內聯彙編

gcc的內聯彙編取全域性變數位址

c++為何內聯彙編找不到定義的變數?

nasm x86彙編入門指南

關於c語言和組合語言混合程式設計的一點思考

nasm入門教程(part1)

nasm彙編helloworld

gcc 和 nasm 聯合編譯,彙編函式前要有引到下劃線 _

compiling c

ld: i386 architecture of input file `hello.o』 is in

gcc的mtune和march選項分析

x86_64體系結構函式呼叫時函式引數傳遞方法

linux assemblers: a comparison of gas and nasm

nasm 與 masm語法區別

nasm assembly language tutorials - asmtutor.com

unix下nasm之和c語言互相呼叫

學習 nasm 語言

為什麼在nasm中mov指令往記憶體移資料只能按字的方式

64位模式下 nasm 和c語言的互相呼叫

64位ubuntu 相容32位

首先要開啟64位系統對32位的支援 第一步 確認64為架構的核心 dpkg print architecture 輸出 adm64 說明已擁有64位架構核心。第二步 確認開啟了多架構支援功能 dpkg print foreign architectures 輸出 i386 說明已開啟,如果沒有需要手...

C 中的64位整數

在做acm題時,經常都會遇到一些比較大的整數。而常用的內建整數型別常常顯得太小了 其中long 和 int 範圍是 2 31,2 31 即 2147483648 2147483647。而unsigned範圍是 0,2 32 即0 4294967295。也就是說,常規的32位整數只能夠處理40億以下的...

c 中的64位整數

主流編譯器不支援64位整數。c99將long long納入標準中。long long型別的位數不低於64.linux上gcc從4.5版本開始,完全支援c99標準,因此可以使用long long表示64位整數。windows vc6.0 不支援c99標準,但是windows為了支援64位整型,可以使用...