Win32彙編系列二 資料傳送指令

2021-10-23 17:03:16 字數 4315 閱讀 4529

mov相當於高階語言的賦值語句,如int a= 1,把1賦值給a,1是源,a是目標。mov的語法如下:

mov reg/mem,reg/mem/imm
reg表示暫存器,英文register的縮寫,mem表示記憶體,imm表示立即數,逗號後面的reg/mem/imm都表示源運算元,逗號前面表示目的運算元,mov的功能就是把源運算元的值傳遞給目的運算元。

.386

.model flat, stdcall

option casemap :none

include c:\masm32\include\kernel32.inc

includelib c:\masm32\lib\kernel32.lib

includelib c:\masm32\lib\msvcrt.lib

printf proto c : dword,:vararg

system proto c : dword,:vararg

.data

szmessage db 'a',10,13,0

btest1 dword 1

szpause db 'pause',10,13,0

szoutfmt byte '%d',10,13,0

.code

start:

mov eax, btest1 ;將btest1的值放入eax中

invoke printf,addr szoutfmt,eax ;列印

mov eax, 2 ;將2放入eax中

invoke printf,addr szoutfmt,eax ;列印

mov ebx,3

mov eax, ebx ;將ebx的值放入eax中

invoke printf,addr szoutfmt,eax ;列印

用於實現兩個暫存器或暫存器與記憶體變數之間的內容相互交換,語法如下:

xchg reg/mem, reg/mem
注意:xchg指令無法實現兩個變數之間的交換,只能借助暫存器來完成。

.386

.model flat, stdcall

option casemap :none

include c:\masm32\include\kernel32.inc

includelib c:\masm32\lib\kernel32.lib

includelib c:\masm32\lib\msvcrt.lib

printf proto c : dword,:vararg

system proto c : dword,:vararg

.data

szmessage db 'a',10,13,0

btest1 dword 1

szpause db 'pause',10,13,0

szoutfmt byte '%d',10,13,0

.code

start:

mov eax, 1

mov ebx,2

xchg eax,ebx

invoke printf,addr szoutfmt,eax

invoke printf,addr szoutfmt,ebx

invoke system,addr szpause

end start

下面是實現兩個變數交換。

.386

.model flat, stdcall

option casemap :none

include c:\masm32\include\kernel32.inc

includelib c:\masm32\lib\kernel32.lib

includelib c:\masm32\lib\msvcrt.lib

printf proto c : dword,:vararg

system proto c : dword,:vararg

.data

szmessage db 'a',10,13,0

btest1 dword 1

szpause db 'pause',10,13,0

szoutfmt byte '%d',10,13,0

x dword 1

y dword 2

.code

start:

mov eax,x ;將x放入eax中,eax=1,x=1,y=2

xchg eax,y ;交換y和eax,eax=2,y=1,x=1

mov x,eax ;將eax放入y,x=2,eax=2

invoke printf,addr szoutfmt,x

invoke printf,addr szoutfmt,y

invoke system,addr szpause

end start

這個指令是把8位或16位的源運算元傳送給16位或32位的目的運算元,格式如下:

movsx  reg/mem,reg/mem/imm

movzx reg/mem,reg/mem/imm

movsx 是符號填充指令,用源運算元的符號位來填充目的運算元的高位。

movzx是用0來填充目的運算元的高位。

這個比較簡單,就是將32位暫存器按反向儲存,好吧,這個指令我嘗試時會報錯,具體原因沒深入了解。

Win32彙編系列八,多執行緒

我對windows執行緒api有一種恐怖的感覺,那是因為在以前第一次接觸它的時候是通過vb,好吧,就是vb,在他的開發環境中做子類化或者多執行緒程式設計時,ide總會莫名其妙經常崩潰,以至於後面繼續是哪怕改了乙個字元,執行時都要先儲存一下,因為這個ide可沒有自動儲存功能。但說回來,並不是api恐怖...

Win32彙編基礎

常用指令 mov 目標運算元,源運算元 mov eax,0x0 進行資料傳遞 movzx mov zero x 以0填充高位,用法同上,push poppushad 所有暫存器壓棧 8個 popad 所有暫存器出棧 8個 lea 取位址指令,類似c語言中的 call 呼叫函式指令 add 加 sub...

Win32彙編 實數

386 選擇的處理器 model flat,stdcall option casemap none 指明識別符號大小寫敏感 include kernel32.inc 要引用的標頭檔案 includelib kernel32.lib 要引用的庫檔案 includelib msvcrt.lib 引用c庫...