汇编-程序文本结构
assume cs:codesg //定义段名 //cs表示代码段 ds数据段 ss栈段 codesg segment //代码段开始 start: mov ax,0123H //start表示入口 入口名可以任意 mov bx,0456H add ax,bx add ax,ax mov ax,4c00h //交回程序控制权 int 21h codesg ends //代码段结束 end start //程序结束
伪指令:定义段
xxx segment //段的开始
xxx ends //段的结束
//xxx 是段名
; 注释指令
[ ] 数据偏移地址
用文本编辑器写代码时,mov al,[1] 经过编译器编译后成了 mov al,1 【编译器BUG】
用文本编辑器写代码时,用[bx]来代表地址数据
mov bx,2H mov bl,[bx]
或者加上段地址
mov ax,ds:[1]
8086CPU【】中可以使用的寄存器:bx bp si di
注意:只有四种组合 bx+si bx+di bp+si bp+di
()寄存器或地址中的内容
(ax)=0010H 表示ax中的内容为0010H
(21000H)=0010H 表示2000:1000处的内容为0010H
(ax)=((ds)*16+2) 表示 mov ax,[2]
((ds)*16+2)=(ax) 表示 mov [2],ax
(ax)=(ax)+2 表示 add ax,2
(ax)=(ax)+(bx) 表示 add ax,bx
push ax
(sp)=(sp-2)
((ss)*16+(sp))=(ax)
pop ax
(ax)=((ss)*16+(sp))
(sp)=(sp)+2
idata 代表某个常量
汇编源程序中,数据不能以字母开头
mov ax,0ffffH ;注意 汇编源程序中,数据不能以字母开头,所以加0
DW定义字型数据
DW【word】定义16位数据,每个数据需两个单元存放。高8位数据字节存入高地址字节中,而低8位数据字节则存入低地址字节中
assume cs:codesg codesg segment dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h ;注意:定义在代码段,所以数据放在代码段 start: mov ax,8 mov cx,ax mov bx,0 mov ax,0 S:add ax,cs:[bx] add bx,2 loop s mov ax,4C00H int 21H codesg ends end start
DB定义字节型数据
DB【byte】定义8位数据,每个数据需1个单元存放
定义代码段、数据段、栈段
assume cs:codesg,ds:data,ss:stact ;assume定义段名(段地址),codesg代码段名,data数据段名,stact栈段名 data segment ;数据段 dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h data ends stact segment ;栈段 dw 0,0,0,0,0,0,0,0 stact ends codesg segment start:mov ax,stact ;栈段地址传给ax mov ss,ax mov sp,16 mov ax,data ;数据段地址传给ax mov ds,ax mov bx,0 mov cx,0 S:push [bx] add bx,2 loop s mov bx,0 mov cx,8 s0:pop [bx] add bx,2 loop s0 mov ax,4C00H int 21H codesg ends end start
dd定义双字型数据(32位)
dd【dword】一个双字数据占4个字节单元,读完一个,偏移量加4
assume cs:codesg,ds:datasg datasg segment;数据段 dd 100001 ;被除数(32位) dw 100 ;除数 dw 0 ;保存商 datasg ends codesg segment start: mov ax,datasg mov ds,ax mov si,0 mov ax,[si] ;100001(0001 86A1h)低16位放入ax add si,2 mov dx,[si] ;100001(0001 86A1h)高16位放入dx add si,2 mov bx,[si] ;除数放入bx div bx add si,2 mov [si],ax codesg ends end start
更灵活寻址方式
mov ax,[bx+200]
word ptr和byte ptr
mov word ptr ds:[0],1 ;word ptr表示字单元 mov byte ptr ds:[0],1 ;byte ptr表示字节单元
dup数据的重复
db 重复的次数 dup (重复的字节性数据)
dw 重复的次数 dup (重复的字型数据)
dd 重复的次数 dup (重复的双字性数据)
datasg segment;数据段 db 3 dup(0) ;定义了3个字节,它们都是0,相当于 db 0,0,0 db 3 dup (0,1,2) ;定义了9个字节,它们是0、1、2、0、1、2、0、1、2 相当于 db 0,1,2,0,1,2,0,1,2 db 3 dup('abc','ABC') ;定义了18个字符,它们是 ‘abcABCabcABCabcABC’,相当于 db ‘abcABCabcABCabcABC’ datasg ends
offset获取标号的偏移地址
SEG获取标号的段地址
数学运算符:
+ - * /
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
2020-06-28 pyqtgraph--用addplot绘制图像
2020-06-28 python--pyqtgraph学习目录
2019-06-28 基尔霍夫定律