码迷,mamicode.com
首页 > 其他好文 > 详细

x86 汇编笔记

时间:2015-02-28 18:11:36      阅读:232      评论:0      收藏:0      [点我收藏+]

标签:

①几大寄存器以及通常作用。

自由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
View Code

@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 
View Code

@LOOP用法:绑定CX的自减循环机

@进位可以不用单独存,多字节加法时可以转移到下一步计算中。

 

 

x86 汇编笔记

标签:

原文地址:http://www.cnblogs.com/neopenx/p/4305980.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!