参考书籍:汇编语言--王爽(n27d)
基础知识:
①CPU由运算器、控制器、寄存器等组成。用汇编写代码,其实就是直接对寄存器进行操作!
②通用16位寄存器:AX、BX、CX、DX(每一个都对应高位AH、低位AL)
③8086CPU寻址:段地址*16 + 偏移地址 = 基础地址 + 偏移地址 = 物理地址
④程序执行:CS中的内容*16+IP中的内容(CS-代码段寄存器,IP-指令指针寄存器),相当于每一段就是16位。
⑤修改cs、ip:(每次使用完jmp指令,IP寄存器就会改变)
⑥DS寄存器:存放要访问数据的段地址
将100H(cs:ip=100:0)地址中的数据读取到al中:([...]表示一个内存单元,里面的数表示内存单元的偏移地址。段地址默认取ds中存储的地址,但ds赋地址,必须通过寄存器(这里选用bx)中转)
mov bx,100H
mov ds,bx
mov al,[0]
如果上述代码中的0是一个寄存器,如ax,则ax中存储的是偏移地址,段地址还是会从ds中取。
⑦入栈、出栈(形象生动)
push 寄存器(将一个寄存器中的数据入栈)、pop 寄存器(用一个寄存器接收出栈的数据)
push 段寄存器(将一个段寄存器中的数据入栈)、pop段 寄存器(用一个段寄存器接收出栈的数据)
push 内存单元(将一个内存字单元处的字入栈,以字为单位进行操作)、pop 内存单元(用一个内存字单元接收出栈的数据)
⑧()的意思:表示对应寄存器或者内存中的内容
1、汇编实现1+2+……+100的程序
assume cs:codeseg ;cs表示代码段寄存器
codeseg segment
start:
mov ax,1
mov bx,0
loops: add bx,ax
add ax,1
cmp ax,100
je loope
loop loops
loope:
mov ax,4c00h
int 21h
codeseg ends
end start
2、十进制转十六进制格式输出
assume cs:codeseg
codeseg segment
start:
mov ax,10
mov dl,55
add dl,al
mov ah,02h
int 21h
mov ax,4c00h
int 21h
codeseg ends
end start
ax输入为10,即al=Ah,ah=00h输出为A