汇编1.基础
-
解压出来, 运行:
dosbox.exe
-
将主机的文件夹挂载到模拟器中, 为了能够让模拟器操作主机中的文件.
-
mount C: d:\dosbox
mount C: . (一个点是挂载exe所在当前目录) -
C: - 表示的是模拟器中的路径.
-
d:\dosbox - 主机中的路径
-
将主机中的文件夹挂载到模拟器C盘
-
-
输入盘符,切换到挂载好的盘中.
-
启动debug
-
命令:
-
寄存器 :
r
- 查看/修改寄存器-
修改寄存器
r ax
-
-
内存相关:
d
- 查看内存 ,e
-修改内存-
查看内存:
d 1000:200
-
修改内存:
e 1000:200
-
-
运行相关:
t
- 单步步入 ,p
- 单步步过 -
反汇编相关:
-
a
- 进行汇编,a 1000:200
输入汇编代码 -
u
- 查看汇编u 1000:200
-
-
退出调试器:
q
-
-
使用TD.exe
-
16位汇编指令
指令帮助文档
-
imm
- 立即数,操作数可以是数字. 后面带有数字,例如imm8
,imm16
,数字表示立即数的字节数. -
reg
- 表示通用寄存器种的任意一个, 后面带有数字,例如reg8
,reg16
; , 表示只能使用特定大小的寄存器, 例如, 如果是reg8
就只能使用al,ah,bl,bh,cl,ch,dl,dh
中的一个.如果是reg16
,就不能使用al
这种的8位寄存器. -
seg/sreg
- 表示段寄存器.只能是cs,ds,es,ss
-
mem
- 表示内存, 后面带有数字,例如mem8
,mem16
,表示读写内存的字节数. 表示内存操作数大小时, 需要使用byte ptr
,word ptr
,dword ptr
, 例如:byte ptr ds:[1000]
,表示能从ds:[1000]
读写1个字节.
dword ptr ds:[1000]
,表示能从ds:[1000]
读写4个字节.
汇编指令的使用规则
-
操作数只能是: 数字, 寄存器, 内存3种
-
两个操作数的大小必须一样.
-
mov [1000h] , 100
; 错误指令,无法确定内存操作数的大小,也无法确定立即数的大小. 改成mov word ptr [1000h],100
-
mov ax , 10
, 正确的, 如果已经确定了其中一个操作数的大小的时候, 另一个操作数的大小不用给出, :mov [1000h],ax
,此处虽然没有给出内存操作数的大小, 但是ax的大小是固定不变的, 因此, 内存操作数的大小就可以使用ax的大小来确定,就是word ptr
.
-
-
两个操作数不能同时都是内存.
-
mov [1000h],[1004h]
改成:mov ax,[1004h]; mov [1000h],ax
-
-
目标操作数不能是数字
-
mov 1 , ax
错误
-
数据传输指令
-
mov - 将源操作数赋值到目标操作数
-
xchg - 交换两个操作数.
-
栈操作有关的指令:
-
push - 将一个数值压入内存中(内存的地址由
sp
寄存器来提供) -
pop - 将一个数值从内存提取出来,保存到目标操作数中内存地址由
sp
寄存器提供) -
pushf/popf - 将标志寄存器的内容压入/弹出栈
-
pusha/popa - 将所有寄存器状态压入/弹出堆栈
-
压入的顺序: ax,cx,dx,bx,sp,bp,si,di
-
出栈的顺序, 和压入的顺序相反.
-
-
算术运算指令
-
加
-
inc
-自增1 -
add
- 加法 , 将源操作数累加到目标操作数上. 相当于+=
-
-
减
-
dec
- 自减1 -
sub
- 减法, 将源操作数累减到目标操作数上, 相当于-=
-
-
乘
-
无符号乘法
-
mul
只有一个操作数, 使用al/ax
作为默认操作数, 相乘得到的结果保存到ax/dx:ax
中.
-
-
有符号乘法
-
imul
单操作数, 使用al/ax
作为默认操作数, 相乘得到的结果保存到ax/dx:ax
中. -
imul
双操作数, 源操作数乘以目标操作数, 结果存放到目标操作数中. -
imul
三操作数, 后两个操作数相乘,结果存放到第一个操作数.
-
-
-
除/取余
-
无符号除法
-
div
- 单操作数, 操作数是除数, 被除数是al/dx:ax
, 8位运算时,商保存在al
,余数保存在ah
,16位运算, 商保存在ax
,余数保存在dx
-
-
有符号:
-
idiv
单操作数, 使用和div
一样.
-
-
位操作指令
-
移位运算:
-
shl
- 左移运算 -
shr
- 右移运算 -
and
按位与 -
or
按位或 -
not
按位取反
-
课后作业
使用汇编语言将下列算式给翻译出来,只允许使用ax,bx,cx和sp寄存器,可以使用栈
int a=10;
int b=20;
int c=4;
a = (a << c) * (a>>c) / ((c ^ a) | (c ^b )) - (++c + --a)
部分示例:
mov ax,10;
mov bx,20;
mov cx,4;