首页 > 编程知识 正文

加减乘除汇编语言程序设计,汇编语言的乘法指令

时间:2023-05-03 17:13:35 阅读:59045 作者:2871

文章列表减法指令1 .减法指令SUB2.带借位减法指令SBB3的减法指令DEC4 .补偿指令NEG5 .比较指令CMP[例]大小写转换程序

减法命令

减法主要包括SUB、SBB、DEC、NEG和CMP指令,除DEC不影响CF标志外,按定义影响所有状态标志位。

1 .减法指令SUB减法指令sub(subtract )从目标操作数中减去源操作数,并将差分结果发送到目标操作数。 格式如下:

SUB reg,imm/reg/mem; 减法:reg=reg-imm/reg/mem

子mem,imm/reg; 减法:mem=mem-imm/reg

像ADD指令一样,SUB指令支持寄存器与即时数、寄存器、存储单元、以及存储单元与即时数、寄存器之间的减法运算,根据定义会影响6个状态标志位。 例如:

mov eax,Oaaff7348h; EAX=AAFF7348H

sub al,27h; EAX=AAFF7321H,OF=0,SF=0,ZF=0,PF=1,CF=0

sub ax、3fffh; EAX=AAFF3322H,OF=O,SF=0,ZF=0,PF=1,CF=0

sub eax,0bb000000h; EAX=EFFF3322H,OF=0,SF=1,ZF=0,PF=1,CF=1

2 .带借位减法指令的SBB带借位减法指令的sbb(SUBtractwithborrow )在完成sub减法的基础上减去借位CF,结果发送到目标操作数,根据定义影响6个状态标志位。 格式如下:

SBB reg,imm/reg/mem; 减法:reg=reg-imm/reg/mem-CF

SBB mem,imm/reg; 减法:mem=mem-imm/reg-CF

SBB指令主要与SUB指令相结合,用于实现高精度度数的减法。 要减去多于32位的数据,必须先减去两个操作数的低位32位,再减去高位部分,再从高位中减去借用位(需要SBB指令)。

3减少指令DEC减少指令dec(decrement )使操作数为1 (减少),将结果复原。 格式如下:

DEC reg/mem; l:reg/mem=reg/mem-1

DEC指令支持INC指令,主要用于计数器和地址指针的调整,不影响进位CF标志,但不影响其他状态标志位。 例如:

dec cx; 字数据负1:CX=CX-1

dec byte ptr[ebx]; 字节数数据减1:[EBX]=[EBX]-1

4 .补充指令NEG补充指令neg(negative )也是对操作数执行补充运算的单一操作数指令。 即,从零中减去操作数,其结果返回操作数。

NEG reg/mem; 使用o作为减法:reg/mem=0-reg/mem

NEG指令对标志的影响与用于减去零的SUB指令相同,例如:

mov ax,0ff64h

neg al; AX=FF9CH,OF-0,SF-1,ZF=0,PF-1,CF=1

sub al、9dh; AX=FFFFH,OF-O,SF=1,ZF=0,PF-1,CF=1

neg ax; AX=0001H,OF=0,SF-O,ZF=O,PF=O,CF-1

dec al :AX 0000H,OF=O,SF=O,ZF=1,PF=1,CF=1

neg ax; AX=0000H,OF=0,SF=0,ZF=1,PF=1,CF=0

补充命令NEG可用于补充负数,或根据负数的补充求出绝对值。 例如,

; 求出已知100的8位代码、-100的8位补数

mov al,64h; AL=64H=100

neg al; AL=0-64H=9CH=-100

; OF=0,SF=1,ZF=0,PF=1,CF=1

; 因为知道-100的32位补数,所以求出其绝对值(即100 )

mov eax,Offffff9ch; EAX=FFFFFF9CH=-100

neg eax; EAX=0 -FFFFFF9CH=64H=100

; OF=O,SF=0,ZF=O,PF=0,CF=1

NEG指令隐式使用0作为被减数,因此如果操作数(减数)不是0,则不借用位数。 也就是说,CF=0。

其他情况下CF=1。 类似地,只有操作数为80h(8位补码)、8000 h (16位补码)或8000000 h (32 )

位补充)时溢出,即标志OF=1,否则OF=0

5 .比较命令CMP比较是指关闭CMP (比较),从目标操作数中减去源操作数,以防止差值返回目标操作数,但减法结果会影响状态并导致悲伤。 格式如下:

CMP reg,imm/reg/mem; 减法:reg-imm/reg/mem

CMP mem,imm/reg; 减法:mem-imm/reg

CMP命令通过减法影响状态标志,可以从标志的状态中知道两个操作数的大小关系。 这主要是因为在条件转移等指令中使用其形成的状态标志。

[示例]大小写转换程序数据段

Msg字节’欢迎’,0; 由小写字母组成的字符串。 最后0是末尾的字符

; 代码段

mov ecx,(长度of msg )-1; ECX与字符串的长度相同。 负1是删除最后一个结尾字符

mov ebx,0; EBX=0是指开头的一个字符

again: sub msg[ebx],‘a’-‘a’; 从小写字母中减去20H转换为大写字母

inc ebx; 指向下一个字符

cmp ebx,ecx; 比较EBX是否仍指向字符串中的字符

jbe again; 是的,循环。 继续处理

mov eax,offset msg; 不,结束处理

call dispmsg; 的双曲馀弦值

此程序示例将由小写字母组成的字符串更改为大写并显示。 小写字母和对应的大写字母相差20H ()‘a’-‘a’=61h-41h ),因此从小写字母中减去20H变成大写,反之大写加上20H则变成小写。 因为给定的字符串都是小写字母组成的,所以程序没有判断是否是小写字母

本例程序的减法指令,用MSG [EBX]指向字符串中的字符是为了寄存器的相对寻址目的的效果,MSG表示字符串的开头位置,EBX指向字符串中的字符。 在运行中取出小写字母,减去20H使其大写,保存到原来的位置。

用CMP指令比较EBX和ECX (保存字符串长度),EBX小于或等于ecx (jbe指令条件)表示所有字符的处理未完成,必须跳转到标签AGAIN继续处理。 否则结束处理。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。