汇编语言

来源:互联网 发布:办公软件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寄存器 
1514131211109876543210xxxxOFDFIFTFSFZFxAFxPFxCF(1)

非符号数相加溢出: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

1 0
原创粉丝点击