💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
[TOC] # **汇编指令** ## **move指令** | 指令形式 | 例子 | | --- | --- | | mov 寄存器,数据 | mov ax,8 | | ~~mov 段寄存器,数据~~ | ~~mov ds,8~~ | | mov 寄存器,寄存器 | mov ax,bx | | mov 寄存器,段寄存器 | mov ax,ds | | mov 段寄存器,寄存器 | mov ds,ax | | ~~mov 段寄存器,段寄存器~~ | ~~mov ds,cs~~ | | mov 寄存器,内存单元 | mov ax,[0] | | mov 内存单元,寄存器 | mov [0],ax | | mov 内存单元,段寄存器 | mov [0],ds | | mov 段寄存器,内存单元 | mov ds,[0] | | | | | | | **实例** ![](https://img.kancloud.cn/92/7c/927c1baa4e846e490dd8fb9028b5adfd_909x295.png) | 指令形式 | 例子 | | --- | --- | | add 寄存器,数据 | add ax,8 | | add 寄存器,寄存器 | add ax,bx | | add 寄存器,内存单元 | add ax,[0] | | add 内存单元,寄存器 | add [9],ax | | ~~add 内存单元,内存单元~~ | ~~add [9],[0]~~ | | 段寄存器是不能参与add和sub运算的,内存单元只能是一个 | | | | | | | | | | | | | | ## **add加指令:满16进1** ![](https://img.kancloud.cn/d8/45/d8453171fee2391dca6e607888eee60b_712x329.png) ## **sub减指令:向前借1增16** ![](https://img.kancloud.cn/eb/36/eb36eec18a0ec040df33cb44e46ebaf3_707x325.png) ## **小结** 加法满16进1 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | | --- | --- |--- | --- |--- | --- |--- | --- |--- | --- |--- | --- |--- | --- |--- | --- | | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F | 汇编命令不区分大小写 ![](https://img.kancloud.cn/8f/76/8f76eca2cf8d1d1ffc48f15d41d0df7c_861x397.png) ![](https://img.kancloud.cn/13/c7/13c7efefbe4af4b3a69342a72d1d31ec_879x502.png) ## **实操** 必须将汇编命令写入CS寄存器(相当于特殊段地址)和IP(相当于偏移地址)指定的内存里 t会向下逐个执行汇编命令,那么执行后怎么才能重置到自己想执行汇编命令的位置?如跳回到`mov ax,1000`jmp 073f:100 ![](https://img.kancloud.cn/2c/99/2c9973bdf5aec7728d79f05eef96912d_889x482.png) ![](https://img.kancloud.cn/44/e3/44e3676e475d8860b5412780cdb28ff9_896x569.png) ![](https://img.kancloud.cn/34/26/3426408810a01b6491b51a31cf533579_899x242.png) ## **栈操作** 栈特点:后进先出 ### **入栈:push** 将会一个新的元素放到栈顶 | 指令形式 | 例子 | | --- | --- | | push 寄存器 | push ax | | push 段寄存器 | push ds | | push内存单元 | push [0] | | | | 从栈顶取出一个元素 ### **出栈:pop** | 指令形式 | 例子 | | --- | --- | | pop 寄存器 | pop ax | | pop 段寄存器 | pop ds | | pop 内存单元 | push [0] | | | | # **伪指令** ## **assume :假设** 这条伪指令的含义为“假设”。它假设某一段寄存器和程序中的某一个用segment...ends定义的段相关联。通过assume说明这种关联,在需要的情况下,编译程序可以将段寄存器和某一个具体的段相联系。 assume并不是一条非要深入理解不可的伪指令,以后我们编程时,记着用assume将有特定用途的段和相关的段寄存器关联起来即可。 ## **end:汇编程序结束标记** 汇编程序的结束标记。若程序结尾处不加end ,编译器在编译程序时,无法知道程序在何处结束。 ## **段名+segment [...] 段名+ends:段定义** 我们在前面的课程中所讲解的段的概念,在汇编源程序中得到了应用与体现,一个源程序中所有将被计算机所处理的信息:指令、数据、栈,被划分到了不同的段中。 一个汇编程序是由多个段组成的,这些段被用来存放代码数据,或当作间来使用。 一个有意义的汇编程序中至少要有一个段,这个段用来存放代码。 ``` assume cs:codesg codesg segment mov ax,0123H ... ... codesg segment end ``` ``` ;特殊段的关联 assume cs:codesg,ds:data,ss:stack ;数据段 data segment dw 0123H,0456H,0789H,0abcH,odefH data ends ;栈段 stack segment dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 stack ends ;代码段 codesg segment mov ax,stack mov ss,ax mov sp,20h ;设置栈段 mov ax,data mov ds,ax ;设置数据段 mov bx,0 mov cx,8 s: push [bx] add bx,2 loop s ... ... codesg segment end ```