放d盘
(1)mount c d:\masm(masm):把c挂载到d盘的masm
(2)c:
(1)d 0000:0000
(2)d 0000:9
(3)d 0000:0000 f
(4)d
(5)d 0000
(1)e 0000:0000 12 34 56 78
(2)e 0000:0000
a 073F:0100
add bx,ax
mov cx,ax
mov ax 8
mov bx,ax
mov ch 10
mov cl 10
mov al ch
(1)8x8:一个存放al,另一个输入,结果存放ax;
(2)16x16:一个默认ax,另一个输入,结果存放dx和ax;
(1)16位除以8位:被除数存放ax,除数存放bx,结果商存放al,余数存放ah
(2)32位除以16位:被除数存放dx和ax,除数存放bx,结果上存放ax,余数存放dx
mov al,01100011B
and al,00111011B
mov al,01100011B
or al,00111011B
(1)数据左移,移出位存放CF,低位补0
eg:
mov al,01001000B
shl al,1
result:(al)=10010000B,CF=0
eg:ax
eg:xchg ax,bx
eg:neg ax
(1)除以0发生错误等中断跳转地址
(2)退出:
mov ax,4C
int 21
mov bx,076A
mov ds,bx
mov ax,[60] ;将ds:0060的值赋值给ax
形如指针,指哪从哪开始执行
(1)jmp 1000:3:跳转到cs=1000:ip=0003
(2)jmp bx:跳转到cs:ip=bx
(1)永远指向栈的顶端
(2)高位先放在下面,低位放在上面
mov ax,0123H
push ax ;将寄存器中的值压入栈中
pop bx ;将栈中元素弹出到bx
pop cx
(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
- 溢出:OF=OV/NV——二进制的正负,十进制的区间
- 符号:SF=NG/PL——注:OF=0,SF=1则为负,SF=0则为非负
- 零:ZF=ZR/NZ
- 奇偶:PF=PE/PO
- 进位:CF=CY/NC——相应进制的位数
- 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
- masm code
- link code
- debug code.exe/code
#计算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:不循环
函数的调用与压栈弹栈息息相关
- 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,直接执行下一条指令
- db 8,dw 16,dd 32,dq 64
- dup
栈的dup,单位为一行
db 3 dup(1,2,3)#123123123
db 3 dup(‘abc’,’ABC’)#abcabcABCABC
- 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
数组的移动从0开始,以db为单位移动
- type
mov ax,word ptr arr[2]:会被多吃
mov al,arr[2]:ax可能残留其他值
附录:
(1)一个字=两个字节
(2)一字节=8位二进制
(3)