Skip to content

Latest commit

 

History

History
376 lines (197 loc) · 5.55 KB

汇编语言.md

File metadata and controls

376 lines (197 loc) · 5.55 KB

汇编语言

一、环境

1.MASM

放d盘

2.DOSBox-0.74
3.进入环境

(1)mount c d:\masm(masm):把c挂载到d盘的masm

(2)c:

二、指令

debug6指令,四个通用寄存器
1.R查看、改变CPU寄存器的内容
2.D查看内存中的内容

(1)d 0000:0000

(2)d 0000:9

(3)d 0000:0000 f

(4)d

(5)d 0000

3.E改写内存的内容

(1)e 0000:0000 12 34 56 78

(2)e 0000:0000

4.U机器语言翻译成汇编指令
5.T执行一条机器命令
6.A以汇编格式存入一条指令

a 073F:0100

add bx,ax

mov cx,ax

计算指令
1.mov

mov ax 8

mov bx,ax

mov ch 10

mov cl 10

mov al ch

2.add
3.sub
4.mul

(1)8x8:一个存放al,另一个输入,结果存放ax;

(2)16x16:一个默认ax,另一个输入,结果存放dx和ax;

5.div除法

(1)16位除以8位:被除数存放ax,除数存放bx,结果商存放al,余数存放ah

(2)32位除以16位:被除数存放dx和ax,除数存放bx,结果上存放ax,余数存放dx

6.and与运算

mov al,01100011B

and al,00111011B

7.or或运算

mov al,01100011B

or al,00111011B

8.shl左移

(1)数据左移,移出位存放CF,低位补0

eg:

mov al,01001000B

shl al,1

result:(al)=10010000B,CF=0

9.shr右移
10.inc自增

eg:ax

11.dec自减
12.xchg交换

eg:xchg ax,bx

13.neg补码

eg:neg ax

14.int中断

(1)除以0发生错误等中断跳转地址

(2)退出:

mov ax,4C

int 21

三、寄存器

1、物理地址=段地址*16+偏移地址
2、ds和[address]

mov bx,076A

mov ds,bx

mov ax,[60] ;将ds:0060的值赋值给ax

3、cs:ip指针

形如指针,指哪从哪开始执行

4、jmp跳转指令

(1)jmp 1000:3:跳转到cs=1000:ip=0003

(2)jmp bx:跳转到cs:ip=bx

5、ss:sp栈指针

(1)永远指向栈的顶端

(2)高位先放在下面,低位放在上面

6、压栈push,弹栈pop

mov ax,0123H

push ax ;将寄存器中的值压入栈中

pop bx ;将栈中元素弹出到bx

pop cx

7、寻址

(1)mov ax,[1000] ;将ds:ip=1000中的值赋值给ax

(2)mov ax,1000 ;将1000赋值给ax——直接寻址——EA=idata;SA=ds

(3)mov ax,[bx] ;将ds:ip=bx中的值赋给ax——寄存器间接寻址——EA=bx;SA=ds

(4)mov ax,[bx+1] ;将ds:ip=bx+1中的值赋给ax——寄存器相对寻址——EA=bx+1;SA=ds

(5)mov ax,bx ;将bx的值赋值给ax

(6)mov ax,[bx+si/di+idata] ;默认段地址在ds中——相对基址变址寻址——EA=bx+si/di+idata;SA=ds

(7)mov ax,[bp+si/di+idata] ;默认段地址在ss中

(8)mov [bx+si+idata],ax

(9)mov ax,[bx+si/di] ;ds:ip=bx+si/di——基址变址寻址——EA=bx+si/di;SA=ds

8、标志位寄存器
  • 溢出:OF=OV/NV——二进制的正负,十进制的区间
  • 符号:SF=NG/PL——注:OF=0,SF=1则为负,SF=0则为非负
  • 零:ZF=ZR/NZ
  • 奇偶:PF=PE/PO
  • 进位:CF=CY/NC——相应进制的位数
9、条件判断语句
  • adc:加的时候,如果CF!=0,要将CF也加上
  • sbb:形如adc
  • cmp:比较语句

je:等于则转移,zf=1

jne:不等于则转移,zf=0

jb:低于则转移,cf=1

jnb:不低于则转移,cf=0

ja:高于则转移(ax>bx),cf=0且zf=0

jna:不高于则转移,cf=1或zf=0

#比较器
inc dx
mov dx,0
dec dx
cmp ax,bx
ja 073F:0100
je 073F:0101
jb 073F:0104  

四、完整代码

1、编译/运行流程
  • masm code
  • link code
  • debug code.exe/code
2、循环指令loop
#计算2的12次方
assume cs:codesg
codesg segment
	mov ax,2
	mov cx,11;循环11次,第一次执行前要先减-1再观察
	s:
		add ax,ax
		loop s;观察cx的值,不为0,继续执行s
	int 21H
codesg ends
end
注:
cx初始为0:死循环
cx初始为1:不循环
3、函数

函数的调用与压栈弹栈息息相关

  • call:调用写好的函数,将call的下一条指令的地址压入栈ss:sp中
  • call far ptr:修改cs:ip,cs与ip顺序压栈
  • ret:执行call的下一条指令,将栈中call的下一条指令弹出
  • ref:远转移,修改cs:ip
assume cs:codesg
codesg segment
	mov ax,2
	mov cx,11
	call s
	int 21H
	s:
		add ax,ax
		loop s
		ret
codesg ends
end
注:
无int 21H,会死循环
call改为ret,弹出的全是0
无ret,直接执行下一条指令
4、代码、数据、栈、dup
  • db 8,dw 16,dd 32,dq 64
  • dup

栈的dup,单位为一行

db 3 dup(1,2,3)#123123123

db 3 dup(‘abc’,’ABC’)#abcabcABCABC

5、跳转指令
  • offset

mov ax,offset start;mov ax,0

mov ax,offset s;mov ax,s的地址

  • jmp short:存的是距离EBXX

  • jmp far ptr:记录cs:ip

  • word/dword ptr:取一个字16位/取一个32位

  • jmp dword ptr:

mov ax,0123H

mov ds:[0],ax

mov word ptr ds:[2],0

jmp dword ptr ds:[0]

执行后,cs=0,ip=0123H,cs:ip指向0000:0123

6、数组

数组的移动从0开始,以db为单位移动

  • type

mov ax,word ptr arr[2]:会被多吃

mov al,arr[2]:ax可能残留其他值

五、简单算法题

1、HELLO WORLD

附录:

(1)一个字=两个字节

(2)一字节=8位二进制

(3)