汇编-程序文本结构

 

复制代码
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获取标号的段地址

数学运算符: 

  +        -         *          / 

 

 

 

 

posted @   天子骄龙  阅读(87)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!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 基尔霍夫定律
点击右上角即可分享
微信分享提示

目录导航