汇编 前期基础指令

m汇编学习过程中用到的实例:
mov ax, 5807h 
mov cx,9 
mov al, [0010h]虽然默认是DS段,但是没加DS的时候还是没有真正从存储器寻址,只好把DS加上了(根据后面的实验,如果不加段寄存器,会被当做立即数看待,和书上讲的还是有点差距奥)。
mov ax, [0010h]这里将把[0010h]计算出来的物理地址PA对应的数值赋给al,然后地址加一位置的数值赋给ax。
mov ax, DS: [0010h] 
MOV bx, 0009h
mov al, DS:[bx]
寄存器间接寻址
MOV bx, 0009h
mov ax, 0010H[BX+SI]
基址变址寻址
  
  
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       

计算指令的平均执行时间:

根据cpu的始终频率计算,计算指令的平均执行时间:
比如我的cpu时钟频率是2.8Ghz=> 单时钟周期为:0.357ns
【1s=1000ms=10(6)微s=10(9)ns】
【1Ghz=10(9)Hz】
还需要理解指令在不同寻址方式下的基本执行时间,以及对应的计算EA所需的周期数。

六类指令:1 传送指令
【1】数据传送指令:
[立即数和段寄存器cs不能作为目的操作数;源操作数和目的操作数不能同为存储器操作器]
mov ax,bx;
mov cl, 80h
mov al, [2000h]
mov DS:[0005h], ax我用的这个版本必须加DS,书上没有见。
这句话的意思是将ax当前的值移动到DS基地址偏移5h的位置,我们在debug中使用d命令查看时,直接 -d 0005就可以看到这个值是否和ax中一致【需要注意的是,d命令中输入的默认地址本来就是相对于段寄存器的偏移地址】
另外这里还可以是CS,ES,但是masm5中居然还不支持FS.
MOV bx, 0001h
mov SI, 0002h
mov word ptr[bx+si], 88h
这条命令就把DS:0003的位置的值赋为88h。由于这里用了word ptr,因此操作数的类型为字,因此是把0080H的值传送到偏移地址0003h处(0003被赋值为80h,同时0004被赋值为00h),如果是mov byte ptr[bx+si], 88h,就不会把0004赋值为00.
mov ax,0a0bh
mov bx,0c0dh
mov cx,0e0eh

push ax
push bx
push cx

pop ax
pop cx
pop bx     
执行完前4句后,把ax放入堆栈中,就可以通过-d SS:[SP的值] 如sp=00fe,这里就是 -d ss:00fe 实际中不要加中括号,来查看栈顶的内容了,如果正常的话,就应该时0b 0a。
执行完pop ax后,ax就被赋值为cx的值了。同理cx=原bx的值;bx等于原ax的值。
实验结果表示同意。

  • 另外需要注意,8086/8088堆栈都是对字操作,不允许对字节操作。比如我们这里的ax(16位,双字节=字),push AH就不是不对的了。
  • 另外CS可以入栈,但是不能随便就弹出一个数据到CS中。
  • 每执行一条push,sp会自动-2,高字节先入栈。出栈pop时,低字节先出,SP+2.
xchg ax, bx会交换两个通用寄存器的值。
  • 不允许使用立即数和段寄存器
  • 是一个改变源操作数的命令(比较特殊,在整个汇编指令中少见)
1.2 累加器专用传送指令 
XLAT把Bx与AL相加形成有效地址,将该单元中的单字节数传送到AL中
mov bx,4c02h
mov al, 1dh
xlat
执行xlat时,根据xlat的定义,就会把bx+al=4c0f位置的值(单字节)送到AL,通过-d 4c0f发现此处是16,正是执行后al的值。
IN 累加器 端口地址从指定地址输入一个字节到AL或输入一个字到AX, 端口地址以数值形式给出或者通过DX间接给出(端口地址大于255时,只能由DX给出)
mov dx, 280h
in al, dx
运行时,debug直接退出了
out 端口地址 累加器实现输出,与IN输入反方向数据传送
1.3 地址传送指令
  • 源操作数必须是存储器操作数,目的操作数必须是16位通用寄存器
  • LEA和LDS/LES是有区别的,LEA直接送的是地址,而其他两个送的是对应地址的存储单元的内容。
LEA 目的操作数 源操作数将源操作数的有效地址EA传送给通用寄存器
mov bx, 0408h
mov si, 2000h
LEA bp, [bx+si+6]
将240EH送BP,而不是将此单元中的内容送BP。
LDS 目的操作数,源操作数
LDS SI, ES:[40H]
将源操作数指定的存储单元中的双字(通常为段地址和有效地址)传送给DS及目的操作数,高两字节送DS,低两字节送目的操作数。
LES 目的操作数,源操作数传送时将高两字节送ES,而不是送DS
1.4 标志传送指令专用于对标志寄存器进行操作。8086、8088标志寄存器具有16位,LAHF和SAHF仅对低8位操作,而PUSHF和POPF对整个标志寄存器操作。只有SAHF和POPF影响标志寄存器的内容。
LAHF将标志寄存器低8位送AH
SAHF将AH送标志寄存器低8位
PUSHF将标志寄存器内容压入堆栈

2 算术运算指令:二进制算术指令运算指令和BCD数算术运算调整指令
mov al, 00eeh
mov bl, 009eh
ADD al, bl

对应的加法SUB:
SUB al, bl
很奇怪的一个现象,当我把eeh赋值给al时,居然不能识别,只好在前面加了两个00.
mov dx, 2000h
mov ax, 8a04h
Add ax, 9D00h
ADC ax, 45H    

对应的减法SBB:    
主要用于多字节加法运算,dx存储了被加数的高两个字节,
ax存储了低两字节;相加后ax=2704h,cf=1(相加结果
超过了两个字节)。adc实现高两字节的相加,且将cf价
值Dx,使DX为2046h。

SBB时同样减去执行前得CF值。
MOV si, 2000h
MOV al, [SI]
INC si
ADD AL, [SI] 

对应的减1 DEC
实现了把2000h单元和2001单元的内容的相加,可以通过 -d 2000 查看。
但是INC(DEC)不影响CF标志。
NEG ax求补码(用0减去自身)
CMP ax, bx如果一样,零标志为1 (zr)
MOV AX, 0202h
MOV CL, 02h
MUL CL
MOV CX, 3000h
MUL CX
MUL WORD PTR [SI]
MOV BX, 20CDh
MUL BX
MOV BX, 10CEh
MUL BX
*****
MOV AL, 0FCH
MOV CL, 1FH
IMUL CL

MOV AL, -04H
MOV bL, 1FH
IMUL bL
MUL 源操作数 (无符号乘法运算)
将(AL)或者(AX)当被乘数,源操作数作为乘数,乘积送AX或者DX,AX:
【1】当源操作数为字节时,默认AL为被乘数,乘积送AX
【2】当为字时,AX被乘数,乘积高两位送DX,低两位送AX

IMUL 有符号乘法运算
MOV ax, 1319h  ;4889
MOV CL, 28h    ;40
DIV CL

*******
DIV 源操作数
实现无符号除法运算,以AX或者(DX,AX)中的内容为别除数,源操作数为除数,商送AL或者AX,余数送AH或者DX:
【1】源为字节:AX被除数,商AL,余数AH
【2】源为字:(DX,AX)被除数,商AX,余数DX
另外,源为字节时,商范围:0--255; 源为字时,商范围:0-65535. 否则:overflow

******
IDIV 有符号除法
8086中指定余数符号与被除数符号相同。
CBW 无操作数
mov al, 98h
cbw
mov al, 76h
cbw
CBW 将AL的符号位扩展到AH中(即AH各位与AL最高位相同),常用在IDIV指令之前。
mov 默认所有数都是以补码形式存在,所以根据首字母是1为负值,0为正值:98H就是-68H,76h就是76h。
CWD CWD 与CBW类似,将AX的符号位扩展到DX中。
十进制算术运算调整指令 

3 位操作指令

逻辑运算符的两个操作数不能同为MEM。
逻辑运算指令 NOT
NOT:
MOV AX, 1
NOT AX
非:按按位取反。 
逻辑运算指令 ANDMOV AL, 88H
AND AL, 0FH
与:按位相与
(常用于屏蔽目的操作数的某些位,即让目的操作数的某些位置为0,其余保持不变)
 
逻辑运算指令 ORMOV AL, 49H
OR AL, 3CH
或:按位或
 (或的目的使源操作数中为1的位置在目标操作数中保持不变)
(能够实现目的操作数的某些位置为1【0,0相与为1, 01与也为1】,其余不变)
 
逻辑运算指令 XORMOV DH, 12H
XOR DH, 80H
******
另一种初始化方法(为0):
XOR AX,AX
用于看出那些位置的不同,或者能达到一下效果:
(原操作数为1的地方,目的操作数对应位置就会改变,这里80H的最高位为1,则将DH的最高位换成了10010010,92H )

 
逻辑运算指令 TESTMOV AL, 21h
Test AL, 01H
和与类似,只是不改变目的操作数。可用于检测AL的最低位,如果AL最低位为0,则与结果为0,从而ZF=1。 反之为NZ。 
移位指令(算术,逻辑移位)MOV AL, 16h
SHL AL, 1

*****
溢出:
MOV AH, 09EH
SAL AH, 2
******
MOV DL, 0F8H ;-8
SAR DL, 1 ;-4

MOV AH, 09EH ;-98
SAR AH, 1 ;-49

MOV AH, 09DH ;-99
SAR AH, 1 ; -50

MOV AH, 09CH ;-100
SAR AH, 1 ; -50
算术移位指令(SAL,SAR)=》有符号数
逻辑移位指令 (SHL,SHR)=》无符号数

左移:最低位补0,最高位送CF
算术右移SAR:高位均保持不变,最低位送CF
逻辑右移SHR:高位补0,最低位送CF



SAR 除法得到的都是整数相除结果,并非类似真正的除法。如-99移右一位就为-50。
 
循环移位指令MOV AL, 0F8H ;
ROL AL, 1

MOV AL, 0F8H ;
ROR AL, 1

MOV DX, 0FFF9H
XOR AX, AX ; ax,cf clear to 0
SAR DX, 1
RCR AX, 1
SAR DX, 1
RCR AX, 1


ROL:左移前的最高位到最低位及CF;
ROR:右移前的最低位到最高位及CF;
RCL: 将目标操作数连同CF循环左移若干位,前进方向上的第一位进CF,CF进另一方向同时。
RCR:与RCL相反。






 
串操作指令字节序列 字序列  
转移指令   
处理器控制指令   
    

处理器控制指令
CLC:CF置为0
CMC: CF取反
STD: DF置为1
CLD:DF=0
STI:IF=1
CLI: IF=0
HLT 暂停
WAIT 等待
LOCK 封锁
NOP
   
    
    
    
    
    

备注:
标志寄存器

溢出标志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) 


******************关于负数:
//对于人们来说,是很好理解,但是机器是怎么知道这个数就是-1?在16位数中“FFFF”
//即可以表示正,也可以表示负。那么,让机器区分正与负的机制在哪里???  
机器不区分,而由人来区分。
********************: 
它们是什么形式的二进制数形式的编码,由汇编程序在汇编时处理。
是正是负,是数值是字符,则是在运行时由程序指令来解释。
比如:
MOV AL,ABC
这里的ABC会被汇编程序处理成8位的0FFH


MOV AX,ABC
则会被理解成16位的0FFFFH。

如果是
MOV BL,ABC
MUL BL
这个ABC就等于255

如果是
MOV BL, ABC
IMUL BL
这个ABC就是 -1

***********
写汇编代码的时候直接写负数即可,汇编的时候会自动把它转换为补码表示的负数,没有问题的

************
当为字节时:有符号的范围:0 ~ 127           -1 ~ -128         无符号的范围: 0 ~ 255
当为字 时:有符号的范围:  0 ~ 32767         -1 ~ -32768       无符号的范围: 0 ~ 65535
当为双字时:有符号的范围: 0 ~ 2147483647    -1 ~ -2147483648  无符号的范围: 0 ~ 4294967295
***********
mov 默认所有数都是以补码形式存在,所以根据首字母是1为负值,0为正值:98H就是-68H,76h就是76h。

REG寄存器
MEM存储器
IMM立即数




  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值