Masm64:乘法、除法、符号扩展指令
Masm64:乘法、除法指令
1. 乘法指令
MUL(无符号数乘法)
操作数:MUL指令有一个操作数,这个操作数可以是寄存器或者内存单元。另一个操作数默认是寄存器RAX(在64 - bit模式下)。
功能:执行无符号数乘法操作。如果操作数是8位的,结果存放在AX中(高8位在AH,低8位在AL);如果操作数是16位的,结果存放在DX:AX中(高16位在DX,低16位在AX);在64 - bit模式下,如果操作数是64位的,结果存放在RDX:RAX中(高64位在RDX,低64位在RAX)。
假设var1是一个64 - bit的无符号数变量,mul var1:将RAX中的无符号数与var1中的无符号数相乘,结果的低64位存于RAX,高64位存于RDX。
IMUL(有符号数乘法)
操作数与功能:IMUL指令与MUL指令类似,但用于有符号数乘法。它也有多种形式,可以有一个操作数(另一个操作数默认是RAX),也可以有三个操作数(第一个操作数乘以第二个操作数,结果存放在第三个操作数指定的位置)。
单操作数形式:imul rbx:将RAX中的有符号数与rbx中的有符号数相乘,结果的低64位存于RAX,高64位存于RDX(与MUL类似,但针对有符号数)。
三操作数形式:imul rax, rbx, 5:将rbx中的有符号数乘以5,结果存放在rax中。
2. 除法指令
DIV(无符号数除法)
操作数:DIV指令有一个操作数,这个操作数可以是寄存器或者内存单元。被除数默认是RDX:RAX(在64 - bit模式下)。
功能:执行无符号数除法操作。如果操作数是8位的,AX除以操作数,商存于AL,余数存于AH;如果操作数是16位的,DX:AX除以操作数,商存于AX,余数存于DX;在64 - bit模式下,如果操作数是64位的,RDX:RAX除以操作数,商存于RAX,余数存于RDX。
假设var2是一个64 - bit的无符号数变量,div var2:将RDX:RAX中的无符号数除以var2中的无符号数,商存于RAX,余数存于RDX。
IDIV(有符号数除法)
操作数与功能:IDIV指令与DIV指令类似,但用于有符号数除法。被除数默认也是RDX:RAX(在64 - bit模式下)。
假设var3是一个64 - bit的有符号数变量,idiv var3:将RDX:RAX中的有符号数除以var3中的有符号数,商存于RAX,余数存于RDX。
在使用乘除指令时,需要注意操作数的类型(有符号或无符号)以及结果的存放位置,以确保得到正确的计算结果。
Masm64:符号扩展指令
1. 符号扩展的概念
在MASM64中,符号扩展指令用于将较小的数据类型转换为较大的数据类型时,保持数据的符号位不变。例如,将一个字节(8位)有符号数扩展为双字(32位)或四字(64位)有符号数时,需要根据原字节数的符号位填充扩展后的高位部分。
2. 常见的符号扩展指令
CBW(Convert Byte to Word)/ CWD(Convert Word to Double - word)/ CDQ(Convert Double - word to Quad - word)
CBW
功能:将AL寄存器中的有符号字节数扩展为AX寄存器中的有符号字(16位)数。如果AL的最高位(符号位)为0,则AH被填充为0;如果AL的最高位为1,则AH被填充为全1。
假设AL中存储着有符号字节数 - 5(二进制为11111011)。
mov al, 0FBh ; 十六进制表示 - 5 cbw ; 执行CBW指令后,AX的值为FFFFFBh,即 - 5的16位有符号数表示
CWD
功能:将AX寄存器中的有符号字数扩展为DX:AX寄存器对中的有符号双字数(32位)。如果AX的最高位(符号位)为0,则DX被填充为0;如果AX的最高位为1,则DX被填充为全1。
假设AX中存储着有符号字数 - 5(十六进制为FFFFFBh)。
mov ax, 0FFFFh mov bx, 0FBh sub ax, bx ; AX现在存储 - 5 cwd ; 执行CWD指令后,DX:AX的值为FFFFFFFFFFFFFBh,即 - 5的32位有符号数表示
CDQ
功能:将EAX寄存器中的有符号双字数扩展为EDX:EAX寄存器对中的有符号四字数(64位)。如果EAX的最高位(符号位)为0,则EDX被填充为0;如果EAX的最高位为1,则EDX被填充为全1。在64 - bit模式下,相当于将RAX寄存器中的有符号双字数扩展为RDX:RAX寄存器对中的有符号四字数。
假设EAX中存储着有符号双字数 - 5(十六进制为FFFFFFFFFFFFFBh)。
mov eax, 0FFFFFFFFh mov ebx, 0FFFFh mov ecx, 0FBh sub eax, ebx sub eax, ecx ; EAX现在存储 - 5 cdq ; 执行CDQ指令后,RDX:RAX的值为FFFFFFFFFFFFFFFFFFFFFBh,即 - 5的64位有符号数表示
MOVSX(Move with Sign - extension)指令
功能:MOVSX用于将源操作数(可以是字节或字)有符号扩展后传送到目的操作数(字、双字或四字)。它可以在不同大小的寄存器或内存与寄存器之间进行操作。
从字节到双字的有符号扩展:
mov al, 0FBh ; 有符号字节 - 5 movsx eax, al ; 将al中的有符号字节 - 5扩展为32位有符号数,EAX的值为FFFFFFFBh
从字到四字的有符号扩展:
mov ax, 0FFFFh movsx rax, ax ; 将ax中的有符号字 - 1扩展为64位有符号数,RAX的值为FFFFFFFFFFFFFFFFFFFFh