标签:
①几大寄存器以及通常作用。
自由16位:AX(数据段)、BX(偏移地址)、CX(计数器) 、DX(临时数据)
AH(中断、进位)、AL、BH/L,CH/L,DH/L
指针16位:SP,BP
索引16位:SI、DI(都作为偏移地址的指针)
段16位:CS、DS、SS、ES
指令&标志:暂时没研究
[限]偏移地址寄存器:BX,SI,DI
[限]计数器寄存器:CX,LOOP语句检测=DEC CX&JNZ
②常用语句
MOV AX,01 //赋值,寄存器作为左值
ADD AX,BX //不进位加法,这里进位是指溢出问题
由于8086中16位的最大值是0xFFFF(65535),超过这个范围溢出, 结果=真值-65536*(进位+1),超过16位数据,非智能进位,需要查看双字节后的字节,并*65536还原计算
所以要记录溢出的进位,最后还原出真值
③汇编程序四大段结构
SS(栈段):通常就一条语句 .STACK 64 ,设置栈大小64kb
DS(数据段):存各种变量
存储规则:小端格式。如16位数据35F3H,起始偏移位置0000,那么0000处的8位数据F3,0001处是35,字符串不是这个规则存储。
CS(代码段):代码就放这
ES(附加段):还没研究
几个地址问题
逻辑地址=段地址:偏移地址(16位,上下界0/FFFF),如2500:0100
物理地址=段地址左移一位(右补一个0)+偏移地址(20位)
④基本变量
EQU 常量
DB 单字节,DW 双字节,DD 四字节,DQ 八字节,DT 十字节
DB只能8/16位寄存器,DW只能16位寄存器.
DD计算,在8086里需要循环移位2次,DQ 4次,DT 5次
④基本汇编程序
//双字节累加
.MODEL SMALL .STACK 64 .DATA ARRAY DW 23333,23333,23333,23333,23333 SUM DW 2 DUP(0) .CODE MAIN PROC FAR MOV AX,@DATA MOV DS,AX MOV SI,OFFSET ARRAY MOV CX,05 MOV DX,0 MOV BX,0 FOR:ADD DX,[SI] ADD DI,02 ADC BX,0 DEC CX JNZ FOR MOV SUM,DX MOV SUM+2,BX MOV AH,4CH INT 21H MAIN ENDP END MAIN
@ADC用法:ADC做加法时,会偷偷加上之前的累加进位值,清进位CLC
@DW 2等效于一个DD,DUP为多变量初始化
@MOV AH,4CH&INT 21H为中断标志,表示程序结束
//双多字节循环累加
.MODEL SMALL .STACK 64 .DATA COUNT EQU 02 DATA1 DD 12345678 DATA2 DD 23456789 SUM DD 0 .CODE MAIN PROC FAR MOV AX,@DATA MOV DS,AX MOV CX,COUNT MOV SI,OFFSET DATA1 MOV DI,OFFSET DATA2 MOV BX,OFFSET SUM FOR:MOV AX,[SI] ADC AX,[DI] MOV [BX],AX ADD SI,02 ADD DI,02 ADD BX,02 LOOP FOR MOV AH,4CH INT 21H MAIN ENDP END MAIN
@LOOP用法:绑定CX的自减循环机
@进位可以不用单独存,多字节加法时可以转移到下一步计算中。
标签:
原文地址:http://www.cnblogs.com/neopenx/p/4305980.html