汇编语言
来源:互联网 发布:办公软件2007 编辑:程序博客网 时间:2024/06/06 02:49
一、二进制运算
1.用AND运算取特定位,符号&。 0000 1111 & 1010 1010 = 0000 1010
2.用XOR运算在特定位取反,符号^。 0000 1111 ^ 1010 1010 = 1010 0101
3.算术左移即乘2,右移即除2。
二、16位汇编
1.16进制数最高位有字母需要在前加零。
2.ax bx cx dx 为常用寄存器;
sp(stackpointer) bp(basepointer) si(sourceindex) di(dataindex) 偏移地址寄存器;
cs(codesegment) ds(datasegment) es(extrasegment) ss(stacksegment) 段地址寄存器。
3.ss:sp 指向栈顶,汇编中出现bp程序自动补写为ss:bp。
4.sp不可与bp si di一样作偏移地址寄存器,而是只用作堆栈。bx可以替代sp作偏移地址寄存器,但bx不可用于堆栈。
5.16位汇编中的地址表示:段地址:偏移地址。 1234:0000 段地址为段首地址去掉最后一位零,该段首地址为12340h。计算地址为段地址添零后加上偏移地址。
一个段的长度为64kb,即2^16.
6.80(x) x 25(y) 为标准文本模式显示屏,原点(0,0),末点(79,24)。原点在GPU上对应地址B800:0000,计算坐标方式B800:[y*160+x*2]。
B800:0000='A'
B800:0001=17h 蓝底白字 (高四位为背景色,低四位前景色,其中背景色的最高位表示是否闪烁)
7.TC中表示原点(0,0) unsigned char far *p=0xA0000000; /*远指针*/
8.ROM由POST + BIOS组成
POST:power of self test
BIOS:base input/output system
BIOS为一函数集,有键盘、屏幕和硬盘等硬件相关函数。
例如: bioskey(1) -> mov ah, 1
int 16h 检测buf(键盘缓冲区)是否为空,状态有ZF位反映。
bioskey(0) -> mov ah, 0
int 16h 读取buf至ax
9.mov al, ds:[di] 间接寻址
mov al, ds:[2000h] 直接寻址
[bx+si+常数] 可以用来表示结构数组中某个成员的某元素:
struct st{char name[10];short int score;}a[10];ax = a[3].score;mov bx, offset amov si, 36mov ax, [bx+si+10]
10.允许 [bx+si+(-)n] [bx+di+(-)n] [bp+si+(-)n] [bp+di+(-)n] ,寄存器之间不能使用- 。
11.FL寄存器
非符号数相加溢出:0FFh+02h=01h
255+2=1 CF=1,OF=0
符号数相加溢出:0FFh+02h=01h
-1+2=1 CF=1,OF=0
CF=1相当于非符号数的溢出标志,OF=1为符号数的溢出标志。
(2)
AF(Auxiliary Carry Flag)辅助进位标志:运算时低4位向高4位产生进位或借位时AF=1. AF也被称为Adjust flag,
它主要用于支持二进制编码的十进制运算(binary-coded decimal, BCD码)。
(3)
PF(Parity Flag)奇偶标志:当结果操作数低8位中“1”的个数为偶数时,PF=1,全零时,PF=1.
用来为计算机串行传送时可能产生的代码出错情况提供检验条件。
(4)
DF=1时,每次操作后SI、DI减量,DF=0时,每次操作SI、DI增量。字符串复制方向有关。
IF=1时,允许中断,IF=0时,关闭中断。
TF=1时,CPU对每条指令执行后产生一个内部中断,CPU进入单步执行模式(Single-step mode).
mov ax, 1 -> mov ax, 1
mov bx, 2 int 01h
mov bx, 1
int 01h
12.I/O 端口寄存器
in al, 60h;读取当前键码
out 61h, al;把al值发送到61h端口
70h是cmos地址端口,71h是cmos数据端口,与内部时钟相关。
mov al, 0
out 70h, al
in al, 71h;访问cmos 0号内存地址内容
mov al, 1
out 70h, al
mov al, 12
out 71h, al;把12写入cmos 1号内存地址
13.assume cs:code ds:data
ds替代data,data[0] -> ds:[0000]
如不做assume,ds和es在刚载入内存时指向程序段前缀(program segment prefix, psp),PSP共占100h字节,里面存放
与当前exe相关的信息,如命令行参数(psp+80h).
三、其他
1.int 21h 0Ah功能:
buf db 80, 0, 80 dup(0)
buf[0]限制长度(包括回车),buf[1]字符串实际长度(不包括回车).
2.16位只有si,di,bx,bp表示指针,32位eax,ebx,ecx,edx,esi,edi,ebp,esp可以表示指针,64位rax,rbx,rcx,rdx,rsi,rdi,rbp,rsp可以表示指针。
32位近指针:间接寻址,32位增加乘法(一次计算乘法只能出现一次,且常数只能为1、2、4),取消对寄存器使用的限制(esi+edi / ebx+ebp可以使用)。
3.32位远指针:延用16位段寄存器名,宽度也为16位,新增2个段寄存器:fs,gs. ds:esi->48位远指针。
0010:[12345678]对应物理地址查表(global descriptor table, GDT)计算得到,
gdt+10h xx xx 78 56 34 xx xx 12
逆序提取 2,3,4,7字节得到12345678h,所以物理地址位12345678h+12345678h.
一部分xx表示段属性、访问权限等,一部分表示段长度,最长为4G.
4.在有bp时,如mov al, [bp], 省略部分为ss: , 其余情况省略ds: .
如果用ds代替ss, 如ds:[bp] 则该情况被称为段跨越。
5.XCHG的操作数中不能有段寄存器。
6.
非符号数cmp跳转:ja jae jb jbe je jne CF是否为1
符号数cmp跳转:jg jge jl jle je jne SF是否等于OF
7.jcxz(若CX等于零则短跳)常放在LOOP之前配合使用,避免CX=0的情况。因为LOOP之中现将CX递减才判断CX是否为零。
8.retn count; pop ip
; sp = sp + count
四、
1.段定义的一般形式:
segmentname segment [align] [combine] ['class']
statements
segmentname ends
[align]对其方式:byte word dword para(默认,其为16字节) page
[combine]合并类型:public stack common memory at
['class']类别名:自定义
stack 用于堆栈定义,定义后ss=段地址,sp=堆栈最后一字节减1
2.seg运算符,seg variablename(labelname) 表示该变量名(标志名)所在段.
3.
code segmentexit: xxxxxbegin: xxxxxcode endsend begin;指定程序从begin开始,到这里结束4.与C语言#define功能类似,汇编有 = 和 equ 功能
=的操作数是数值或字符或常数表达式,equ不仅有=的功能 还可以是一个汇编语句
dosint equ <int 21h>
..
..
mov ah, 4Ch
mov al, 0
dosint 等价 int 21h 的4C功能
5. y db 2 dup('A', 3 dup(B), 'C') 2表示次数 3表示次数
等价 y db 'A', 'B', 'B', 'B', 'C', 'A', 'B', 'B', 'B', 'C'
6.$表示当前指令处位置计数器的值
用来计算数组元素总数:asd db 'asdeqffqfdwqdqwd'
len = $ - offset asd
data segment
org 1000h
abc db 12h,34h
org $+100h
xyz dw 5678h
data ends
--------------org伪指令设定位置计数器的值
abc偏移地址为1000h,xyz偏移地址为1102h
- 汇编语言
- 汇编语言
- 汇编语言
- 汇编语言
- 汇编语言
- 汇编语言
- 汇编语言
- 汇编语言
- 汇编语言
- 汇编语言
- 汇编语言
- 汇编语言
- 汇编语言
- 汇编语言
- 汇编语言
- 汇编语言
- 《汇编语言》
- 汇编语言
- 大数据架构:flume-ng+Kafka+Storm+HDFS 实时系统组合
- servlet 学习心得
- Android 仿今日头条评论输入框
- MyEclipse安装后,新建Java项目为什么会报错?
- Java实现ANN神经网络之BP代码参考
- 汇编语言
- bzoj 3674: 可持久化并查集加强版 可持久化线段树
- The Winter Is Coming
- java封装redis工具类
- linux下实现对framebuffer(/dev/fb0)的截屏操作
- 分享功能
- 生产者和消费者问题
- Ubuntu10.04搭建ltib(MPC8315E)开发环境
- hibernate.cfg.xml配置信息