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

64位汇编语言基础