如果只用一個 operation, 就只有 shift bit instruction。

TOP

如果以最初x86 instruction level應該無
不過有些16 bit register可以拆做2個8 bit registers (e.g. AX = AH:AL) 咁一個16 bit ADD就可視作2個8 bit ADD(如果無error/overflow)
假設蘋果 AH:AL = 3:3 移動 BH:BL = (-2):(2)
搬蘋果即係  AX+=BX (add AX,BX)
結果 AH:AL = 1:5

當然有MMX/SSE/AVX 呢類 SIMD instruction set的話會直覺D

不過就算有single instruction做, mem read/write期間會有atomicity問題
https://stackoverflow.com/questi ... -in-a-intel-x86-cpu
呢個要睇點先consider atomic
register level 的話不知道要不要理
cache/memory 的話好似要lock instructions (其他thread/硬件dma access)
disk access的話就睇OS/database點實做locking

TOP

多謝各位回覆
我要慢慢消化下
因為超越了我的程度.....
但感覺上應該有人已經給了我想要的答案

TOP

本帖最後由 it_jobs 於 2022-8-4 00:35 編輯

用咩 CPU?

Ref: Wiki
Ch8 in IA Dev Menu

睇下啱唔啱用

TOP

x86 assembly CMPXCHG (CMPXCHG8B, CMPXCHG16B, etc) 或 win32 InterlockedCompareExchange (InterlockedCompareExchange64, etc).

寫入 (1,5)前檢查還是不是(3,3), 是會寫入, 中間不會被改變, return 檢查時的數值, 如return (3,3) 即有寫入; return (3,3)以外的數值即沒有寫入.  這時以更新的數值重複搬兩個的操作, 再嘗試寫入.

TOP

會唔會搵個function 包住, 一個function call 去做一加一減既動作.

TOP

會唔會搵個function 包住, 一個function call 去做一加一減既動作.
happy_99 發表於 2022-8-5 10:52

請問C programming裡面或者其他語言甚至x86 assembly,(其實是電子學的問題,有無呢個可能)
有無辦法可以模
...
不可以有先後之分,一定要一步過
...
skywalker167 發表於 2022-8-1 22:56


要求要不分先後,寫 func 都係將先後執行喎

TOP

不能令兩個var 同時改變 (除非有lock)
但可以用一個var代表兩數 (e.g. 頭4bit 係第一個數)
不要直接更改外面能存取的var
先copy 到 private var 再更改
再一次寫回去

int tmp_var = var
tmp_var = .....
.....
var = tmp_var

理應由外面看來就是“同時”更改了


via HKEPC Reader for Android

TOP

樓主首先要攪清楚乜嘢叫"一步".最基本是CPU指令集一個instruction,咁當然無你講個instruction. 再其次是C裏面一個instruction.咁C call DLL function算唔算一個instruction? 佢背後其實可能有萬幾行code.但是C  一個指令背後可能都有萬幾個CPU instruction.本質上無分別。
如果目標是確保兩個數同步,其他人/程式
access時不會一個變咗一個未變,咁SQL 裏面LOCK TABLE之類就得。直接D你將一個var分成兩部份,例如12034=12, 34
想變成11, 35就要12034+delta, delta=-01000+00001. Commit change都係12034+delta一步,可以確保同步改變。

via HKEPC Reader for Android

TOP

係唔係想做戶口 A 轉錢俾 B, 要確保all or nothing? google 下 ”lock” 吧。low level instruction 層面,有些architecture有提供“compare and swap” 的instruction 可做到類似。

via HKEPC IR Extreme 4.2.3 - Android(4.2.0)

TOP