ASM

预备知识--
1、内存的编排,内存编号为什么从0开始--电路上的限制
2、cpu怎么访问内存--地址线(决定寻址能力)、数据线(决定一次传送多少字节)、控制线(控制计算机各个部件)
3、cpu怎么访问外围设备--IO port、DMA(Direct Memory Access)
4、在内存中,指令和数据没有任何区别,都是二进制信息,只有在CPU工作时才加以区别
cpu怎么区分指令和数据--CPU将cs:ip所指向的内容当作指令来执行,将ds:[偏移地址]指向的内容作为数据,将ss:sp作为栈顶
5、物理地址 = 基地址(段地址 * 16) + 偏移地址-----20根地址线,16位寄存器无法表示,需要乘以16
6、一个字形数据由高位字节(左)和低位字节(右)组成。
在内存中,高地址(右)存放高位字节,低地址(左)存放低位字节
7、常见的ASCII码(shell输入man ascii)--
30H    0
41H    A
61H    a
0AH    换行
0DH    回车

寄存器------汇编程序员通过修改寄存器去控制CPU,进而控制整个计算机
1、数据寄存器(通用寄存器)--
ax(accumulator,计算,IO) bx(base,地址索引) cx(count,计数) dx(data,数据传递)
ax = ax + al
bx = bh + bl
cx = ch + cl
dx = dh + dl
2、地址寄存器--
段地址--ds(data segment,数据从哪里来) es(extra segment,数据到哪里去) ss(stack segment) cs(code segment)
偏移地址--sp(stack pointer,自增自减) bp(base pointer,默认段地址为ss,与函数调用有关) si(souce index,与ds或es联用) di(destination index,与ds或es联用) ip(instruction pointer,自增) bx(base,默认段地址为ds)
3、标志位寄存器--
寄存器                取0            取1        
of(overflow flag 溢出)        nv(not overflow)        ov(overflow)
df(direction flag 方向)        up(up)            dn(down)
if(interrupt flag 中断允许)        ei(enabled interrupt)            di(disabled interrupt)
sf(sign flag 符号)            pl(positive)                            ng(negative)
zf(zero flag 零)            nz(not zero)                          zr(zero)
af(auxiliary carry flag 辅助进位)    na(no auxiliary carry)            ac(auxiliary carry)
pf(parity flag 奇偶)            po(parity odd)                       pe(parity even)
cf(carry flag 进位)            nc(not carry)                          cy(carry)


栈(一段连续的内存单元)
1、作用--临时性保存数据,数据交换
2、特点--先进后出
3、操作--
入栈    sp = sp - 2,在ss:sp的位置入栈
出栈    在ss:sp的位置出栈,sp = sp + 2
4、注意事项--
栈最大为64KB(因为sp变化范围为0~ffffh)
注意栈顶越界问题

指令--
指令周期--取指令(包含PC增量)、译码、地址计算(寻址方式)、取操作数、执行、存放结果
mov
inc
add
sub
mul
--用法    mul 另一个乘数
--8位乘法        al存放一个乘数,8位寄存器或内存单元(字节型)存放另一个乘数,ax存放结果
--16位乘法    ax存放一个乘数,16位寄存器或内存单元(字形)存放另一个乘数,ax存放低16位结果,dx存放高16位结果
div
--用法:    div 除数
--16位除法    ax存放被除数,8位寄存器或内存(byte ptr)存放除数,al存放商,ah存放余数
--32位除法    ax(低16位)和dx(高16位)存放被除数,16位寄存器或内存(word ptr)存放除数,ax存放商,dx存放余数
and    
--用途    将特定位置为0(例如,将小写字母转换为大写字母,and 61h, 11011111b)
or    
--用途    将特定位置为1(例如,将大写字母转换为小写字母,   or   41h, 00100000b)
jmp
--jmp (short) 标号==>修改ip(短跳转,范围为-128~127)
--jmp near ptr 标号==>修改ip(近跳转,同一段范围内)
--jmp far ptr 标号==>修改ip(远跳转,任意位置)
--jmp ax ==> 修改ip
--jmp word ptr 内存单元地址==>修改ip
--jmp dword ptr 内存单元地址==>修改cs(高两位字节)和ip(低两位字节)
call
--call 标号==>push ip(下一条待处理的指令的地址入栈,方便返回), jmp near ptr 标号
--call far ptr 标号==>push cs, push ip, jmp far ptr 标号
--call ax==>push ip, jmp ax
--call word ptr 内存单元地址==>push ip, jmp word ptr 内存单元地址
--call dword ptr 内存单元地址==>push cs, push ip, jmp dword ptr 内存单元地址
ret
--用法:    ret
--相当于pop ip        字形数据
retf
--用法:    retf
--相当于pop ip, pop cs    双字
jcxz--(jmp cx zero)
--用法:    jcxz 标号==>当cx寄存器值为0时,跳转到标号处
loop-------类似于do while
--用法:    loop 标号
--循环次数保存在cx寄存器中
--cx = cx - 1, 如果cx > 0继续循环

debug--
r(register)    查看、改变(r cs)CPU寄存器的内容
d(dump,转储)    查看内存中的内容
e(edit)        改写内存中的内容
u(unassemble)    将内存中的机器指令翻译成汇编指令
t(trace,跟踪)    执行一条机器指令
a(assembly)    以汇编指令的格式在内存中写入一条机器指令
p(proceed,继续)     跳过当前loop指令,call指令,int指令
g(go) xx         跳到xx位置
q(quit)         退出

编程的核心--数据的组织、代码的组织--提高效率

汇编程序格式--
assume cs:code, ds:data, ss:stack, es:extra
data segment
                ;自定义数据写在这里
                ;注意段(segment)的内存分配总是16的倍数(不满16个字节仍然分配16个字节)
                dw(define word)
                db(define byte)
                dd(define dword)
                db 100 dup ('abcdefg')    ;以字节型重复100次abcdefg
data ends

stack segment
                ;临时存放数据
                db 128 dup (0)
stack ends

extra segment
        
extra ends

code segment    
start:        ;代码写在这里        
            
                mov ax, 4c00h
                int 21h    
code ends
end start

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值