实验三 算术运算类指令(汇编语言基础指令学习二)

一、实验目的

位运算类指令和控制转移类指令的用法

掌握:AND、OR、XOR、NOT、TEST、SHL、SHR、SAR、ROL、ROR、RCL、RCR、JMP/JCC

二、实验环境

DOSBox,debug

三、前置知识

常规寄存器

8位寄存器 AH,AL,BH,BL,CH,CL,DH,DL 这里的8位指的是二进制 则我们通过进制转换就可以知道

8位寄存器以16进制存储为两位 , 比如 AH = F6h = 1111 0110b

且在8086操作系统中寄存器都默认以16进制进行存储,所以在进行代码操作时都以16进制来书写

16位寄存器 AX,BX,CX,DX, BP,SP;另外操作数还可以放在4个段寄存器 **SEG (CS DS SS ES)**中。

并且有一个非常重要的点, AX = AH + AL;同时可得BX,CX,DX;

比如

mov al,45; MOV 为赋值操作,从右往左赋值
mov ah,f4;

则 AX = F4 45h; AH表示AX的高8位,AL表示AX的低8位。同理可得其他

状态标志

接下来我们主要来认识几个状态标志

1、进位标志CF(如果运算出现进位或者借位,有借位为1)(Carry Flag

2、溢出标志OF(判断运算结果有没有溢出,溢出为1) (Overflow Flag

3、零标志ZF(判断运算结果是否为0,为0 ZF=1) (Zero Flag

4、符号标志SF(最高位为1,SF=1,反之为0) (Sign Flag

5、奇偶标志PF(最低字节中1的个数为0或者偶数时,PF=1,反之为0)(Parity Flag

6、调整标志AF(最低半字节有没有进位,有则 AF=1)(Adjust Flag

比如 00111010+01111100 =10110010 低4位有进位,AF=1

判断状态标志

溢出标志OF(Over flow flag) OV(1) NV(0)
方向标志DF(Direction flag) DN(1) UP(0)
中断标志IF(Interrupt flag) EI(1) DI(0)
符号标志SF(Sign flag) NG(1) PL(0)
零标志ZF(Zero flag) ZR(1) NZ(0)
辅助标志AF(Auxiliary carry flag) AC(1) NA(0)
奇偶标志PF(Parity flag) PE(1) PO(0)
进位标志CF(Carry flag) CY(1) NC(0)

-r 右下角

OF=0 DF=0 IF=1 SF=0 AF=0 PF=0 CF=0
在这里插入图片描述

四、实验步骤

例2.28 逻辑与运算

mov al,45	;
and al,31	; AL=01H,  CF=OF=0,SF=0,ZF=0,PF=0

在这里插入图片描述
在这里插入图片描述

AND指令可用于复原某些位,但不影响其他位

比如 AND bl,11110110b; 将BL中 属于二进制的第一位和第三位 清0

但是在汇编语言中,我们记得要改变其形式,因为在寄存器中存储是以16进制的存储形式存在,故代码应为

mov bl,FF	; bl = FFh =1111 1111b ;前者为十六进制,后者为二进制
AND bl,F6	; bl = 1111 1111b && 1111 0110b = 1111 0110b = F6h ; 进行与操作应为此

在这里插入图片描述
在这里插入图片描述

例2.29 逻辑或运算

mov al,45	; al= 45h = 0100 0101b;
or  al,31	; al = 0100 0101b || 0011 0001b = 0111 0101b = 75h
			; AL=75H,CF=OF=0,SF=0,ZF=0,PF=0

OR 指令可用于置位某些位,而不影响其他位。这时只需将置于1的位同1 相或即可

例2.30 逻辑异或运算

mov al,45	; 
xor al,31	; al = 0100 0101b 求反 0011 0001b = 0111 0100b = 74h
			; AL=74H,CF = OF =0,SF=0,ZF=0,PF=1

XOR 指令用于求反某些位,其余位不变

XOR 指令经常给寄存器清0,同时使CF清0

xor ax,ax	; AX =0, CF=OF=0,SF=0,ZF=1,PF=1

例2.31 逻辑非指令NOT

NOT指令对操作数按位取反。

mov al,45	;
not al		; al = !(0100 0101b)=1011 1010b = BAh

例2.32 测试指令Test

Test指令对两个操作执行按位的逻辑与运算,但结果不回到目的操作数。

test al,01		; 测试al的最低位d0
jnz		there	; 标志zf=0,即d0=1,则程序转移到there
...				; 否则zf=1,do=0,顺序执行

例2.33 移位指令

移位指令分为逻辑(Logical)移位指令和算术(Arithmetic)移位指令,分别由左移(Left)和右移(Right)。

shl 	;逻辑左移
shr		;逻辑右移
sal		;算术左移
sar		;算术右移

移位指令设置进位标志CF,如果移位前后最高位发生改变,则OF=1,否则OF=0;(只左移或者右移一位

当移位次数大于1时,OF不确定

mov cl,04	
mov al,f0	; al = 1111 0000b
shl al,1	; al = 1110 0000b = e0h ; cf=1,sf=1,zf=0,pf=0,of=0
shr al,1	; al = 0111 0000b = 70h ; cf=0,sf=0,zf=0,pf=0,of=1
sar al,1	; al = 0011 1000b = 38h ; cf=0,sf=0,zf=0,pf=0,of=0
sar al,cl	; al = 0000 0011b = 03h ; cf=1,sf=0,zf=0,pf=1

移位前状态
在这里插入图片描述
移位后状态

在这里插入图片描述
al = e0h ; cf=1,sf=1,zf=0,pf=0,of=0

在这里插入图片描述
al = 70h ; cf=0,sf=0,zf=0,pf=0,of=1

在这里插入图片描述
al = 38h ; cf=0,sf=0,zf=0,pf=0,of=0

在这里插入图片描述
al= 03h ; cf=1,sf=0,zf=0,pf=1

例2.34 利用移位指令计算DX←3×AX+7×BX,假设为无符号数运算,无进位

mov si,ax	
shl si,1	;si=si*2
add	si,ax	;si=si*3
mov dx,bx	
mov cl,03
shl	dx,cl	;dx=bx*8
sub dx,bx	;dx=bx*8-bx=bx*7
add dx,si	;DX←3×AX+7×BX

例2.35 循环(Rotate)移位指令

类似移位指令,但是从一端移出的位返回到另一端形成循环

分为不带进位循环移位和带进位循环移位

rol		;不带进位循环左移
ror		;不带进位循环右移
rcl		;带进位循环左移
rcr		;带进位循环右移

前两条指令不将CF纳入循环位,后两条将CF纳入循环位中

ax =45 ,dx =32
在这里插入图片描述

将DX.AX中的32位数值左移一位

shl ax,1
rcl dx,1

在这里插入图片描述

将AL最低位送BL最低位,但保持AL不变

ror bl,1
ror al,1
rcl bl,1
rol al,1

AH和AL分别存放着非压缩BCD码的两位,使其合并成为一个压缩BCD码存入AL

ah=45h = 0100 0101b
al =32h = 0011 0010b

mov cl,04
rol ah,al
add al,ah


在这里插入图片描述

无条件转移指令

JMP指令分为段内转移和段间转移

(短转移)段内转移指在当前代码段64KB范围内转移,因此不需要更改CS段地址,只要改变IP偏移地址

(远转移)段间转移指从当前代码段跳转到另一个代码段,此时需要更改CS段地址和IP偏移地址

2.38 如果AL最高位为0,则设置AH=0;如果AL最高位为1,则设置AH=FFH

-a 132						;到073F:0132地址写代码
073F:0132 mov ah,0 
073F:0134 xor ax,ax			;清0
073F:0136					;按下回车退出
-a 100						;到073F:0100地址写代码
073F:0100 mov al,f4
073F:0102 test al,80		;测试 al的最高位 是否为0
073F:0104 jz 0132			;最高位为0(zf=1),转移到0132
073F:0106 mov ah,ff
073F:0108 jmp 0140
073F:010A 					;按下回车退出

在这里插入图片描述
在这里插入图片描述

顺序执行,AX=FFF4

2.39 计算|x-y|,结果存入result。

	mov ax,x
	sub ax,y
	jns nooneg	;
	neg ax		; 为负数,进行求补,得到绝对值
nooneg: mov result,ax

2.40 计算X-Y,若溢出,转移到OVERFLOW处理

	mov ax,x
	sub ax,y
	jo overflow
...
overflow:...

2.41 将AL的字符加上奇校验位

	and al,7f
	jnp next
	or al,80
next:...

2.42 记录BX中‘1’的个数

		xor al,al
again:  test bx,ffff
		je next
		shl bx,1
		jnc again
		inc al
		jmpa again
next:	...

2.43 用于比较无符号数高低

		cmp ax,bx
		jnb next
		xchg ax,bx
next:	mov result,ax

2.44 用于比较有符号数高低

		cmp ax,,bx
		jnl next
		xchg ax,bx
next:	mov result,ax

五、实验结果与问题分析

多加练习,勤奋踏实!!!

问题

在进行跳转指令的时候,我发现jmp 跳转到指定单元是可以的,但是其他指令却无法跳转大数据范围

比如

jmp 0200

jz 0200 跳不到0200

JMP和其他JZ,JO等指令可能针对的取值范围不一样

可以肯定JMP比JO要大

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,下面是汇编语言算术运算指令实验报告: 实验目的: 1. 理解汇编语言算术运算指令的含义和作用; 2. 掌握汇编语言算术运算指令的使用方法; 3. 学会设计和编写汇编程序。 实验内容: 本次实验主要涉及到以下算术运算指令: 1. ADD:加法指令,用于将源操作数加到目的操作数中,并将结果存储在目的操作数中。 2. SUB:减法指令,用于将源操作数从目的操作数中减去,并将结果存储在目的操作数中。 3. MUL:乘法指令,用于将源操作数与目的操作数相乘,并将结果存储在目的操作数中。 4. DIV:除法指令,用于将目的操作数除以源操作数,并将商存储在目的操作数中,余数存储在另一个寄存器中。 实验步骤: 1. 设计程序,包括变量的定义、常量的定义、算术运算的处理等。 2. 编写程序,按照步骤实现算术运算。 3. 调试程序,确保程序能够正确地实现算术运算。 4. 运行程序,观察结果是否正确。 实验结果: 下面是一个简单的加法程序: ``` ;定义变量和常量 .DATA X DW 10 Y DW 20 Z DW ? CONST DW 5 .CODE MAIN PROC MOV AX, @DATA MOV DS, AX ;进行加法运算 MOV AX, X ADD AX, Y ADD AX, CONST MOV Z, AX MOV AH, 4CH INT 21H MAIN ENDP END MAIN ``` 运行结果为: Z = X + Y + CONST = 10 + 20 + 5 = 35 实验结论: 本次实验通过设计和编写汇编程序,实现了算术运算指令的处理,并且调试程序确保了程序能够正确地实现算术运算。通过实验,我深入理解了汇编语言算术运算指令的含义和作用,并且掌握了汇编语言算术运算指令的使用方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

月亮&六便士

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值