汇编语言(王爽) 第9章转移指令的原理

啥叫转移指令

修改IP或同时修改CS和IP的指令

只修改IP叫段内转移

同时修改CS和IP叫段间转移

段内转移又分为短转移和近转移

短转移 IP修改范围-128-127

近转移IP修改范围-32768-32767

基本的就上面的

9.1 offset 操作符

s1:mov bx,offset s1

s:mov ax,offset s

offset X就是取得X的偏移地址

first 就是mov bx,ds:ds:[0]

second  is mov ax,ds:[3]

first instruction is 3 byte

9.3 依据位移转移的JMP指令

jmp short 标号(转到标号处执行指令)

其实跳到哪里是看指令的偏移地址,上面说法是错的,比如实验8,分析一个奇怪的程序

9.4 指定转移目的地的指令

jmp far ptr段间转移 远转移

比如 jmp far ptr s 对应的机器码是EA 0B 01 BD 0B

高地址0bdbh是转移的段地址,低地址010bH是偏移地址

9.5 jmp 寄存器

jmp ax

设置IP=ax

9.6 转移地址在内存中的jmp指令

1 jmp word ptr 内存单元地址(段内转移)

mov ax,0123h

mov ds:[0],ax

jmp word ptr ds:[0]

执行后ip=0123h

2 jmp dwood ptr 内存单元地址(段间转移) 2个字

mov ax,0123h

mov ds:[0],ax

mov word ptr ds:[2],0

jmp dword ptr ds:[0]

执行后cs=0.ip=0123h

9.7 jcxz

if(cx==0) jmp short 标号

9.8 loop

cx--

if(cx!=0) jmp short 标号

9.10 编译器对转移位移越界会报错

比如

jmp short s

db 128 dup (1)

s:mov ax,0111h

因为short的IP偏移地址是-128-127

所以超过了1,报错

下面是实验8一个奇怪的实验,主要考察dmp short 标号指令的偏移应用

http://tinylab.org/assembly/sy/sy8.htm

实验9是一个在DOS上打文字的程序

assume cs:code,ds:data
data segment
db ‘welcome to masm!‘
db 02h,24h,24h
data ends
code segment
start:
mov ax,0b872H
mov es,ax

mov ax,data
mov ds,ax

mov bx,0
mov cx,16
mov di,0
s:
mov al,ds:[bx]
mov ah,ds:[18]
mov es:[di],ax
inc bx
add di,2
loop s

mov ax,4c00h
int 21h
code ends
end start

源代码就这样

反正是在显存段b8000H-b8f9fH进行,2个字节的长度,一个放ASCII码另一个放属性

属性就是指背景色,字体色这些

EOF

时间: 2024-08-25 07:31:52

汇编语言(王爽) 第9章转移指令的原理的相关文章

汇编语言(王爽) 第11章 标志寄存器

这里讲一个特殊的寄存器,flag 先看flag的16位显示 11.1 zf 指令执行后,结果0,ZF=1 指令执行后,结果不为0,ZF=0 11.2 pf 指令执行后,所有bit位中1的个数是否位偶数,若为偶数,那么pf=1 若为奇数,pf=0 11.3 sf 指令执行后,结果负,SF=1 指令执行后,结果不为负,SF=0 11.4 cf 进位 若出现进位,那么CF=1 没有的话CF=0 11.5 of 溢出, 数字的溢出. 8位范围是-128-127 若130就是溢出了 11.6 abc指令

汇编语言(王爽) 第7章 寻址方法

这章讲一些寻址方法,对前面寻址方法的总结把 7.1 and or 2个指令 上栗子 mov al,00001111b and al,11110000b al=00000000b mov al,00001111b or al,11110000b al=11111111b 7.2 ASCII码 之前就写过一篇ACSII码的,这里主要写下我们在键盘上按键再输出到屏幕的过程 我们在键盘上按下a键 这个信息被传到计算机,计算机用ASCII码对它编码,成为61h, 再扔到一个内存段中 文本编辑器把内存中的6

汇编语言(王爽) 第10章 call和ret

这2个指令也是转移指令,一起用的时候有特效~~~~ 10.1 ret and retf ret 相当于pop ip 把栈顶的字弹出到ip retf相当于先执行pop ip and pop cs 10.2 call 执行2步 1 先把IP或cs和ip推入栈中 2 转移到 标号或内存处 10.3 call 标号 call 标号 转移范围为-32768-32767 16位转移 相当于执行 push ip jmp near ptr 标号 10.4 call far ptr 标号 相当于 push cs

汇编语言(王爽) 第4章 第一个程序

这章算是一个实践部分把,写 了一个汇编程序,并用debug去跟踪每条指令的进程,看寄存器和内存的变化,算是对之前的一个小总结把 4.1 源程序到执行的过程 一个汇编程序写好,要编译成目标文件,文件后缀是obj的,再链接形成exe后缀的,再接着去执行 4.2 源程序 直接上图把 伪指令由编译器执行,汇编指令由CPU执行 assume是伪指令,关联段寄存器和程序中用segment and end代表的段关联 segment 和ends表示段的开始和结束 end表示整个程序结束 另外程序会有个叫程序返

汇编语言(王爽) 第1章基础知识

1.1 机器语言 机器语言就是机器指令的集合.机器指令是啥呢?就是一列二进制的数据,计算机把它转成高低电平,使计算机的其他器件驱动并运算.(计算机如何使用2进制语言?) 早期程序都是用机器语言写的,但是有个问题就是太麻烦,数据信息太长,写错一个0或1就会来BUG了. 这种机器语言根本不是人写的,注定会被淘汰. 1.2 汇编语言 这个时候,汇编语言就挺身而出. 汇编语言就是机器语言的便于记忆的格式把 一个指令1000100010001000 表示把寄存器A1的内容弄到寄存器A2上.如下 操作介绍:

汇编语言(王爽) 第6章包含多个段的程序

程序到了内存中我们分为code(代码)段,也就是大部分指令段,数据段,栈 6.1 在代码段中使用数据 上图 dw表示define word定义一个字,16位 会出现cs执行的前16位是数据段,后面才是指令,所以要把IP设成10h 或者直接在第一条指令前面在start,再在最后面的end start 程序运行的第一条不是汇编指令可能会报错把 6.2 在代码段中使用栈 这的题目都是从内存单元的数据换到另一个内存单元 开始奇怪,为啥不直接换,还要专门定义一个栈空间出来做个中间体 查了资料才知道,内存单

汇编语言(王爽) 第2章 寄存器

CPU由运算器,控制器,寄存器等器件组成 汇编指令可以操作寄存器中的数据.如mov AX,BX就是把寄存器BX中的值加上寄存器AX中的值,再把结果放在AX上 8086CPU的寄存器的有14个,这里就讲AX,BX,CX,DX,CS,IP这么几个先 2.1通用寄存器 就是指AX,BX,CX,DX 用来存放一般数据 如AX是16位,但是8086CPU之前的一代是8位的,所以AX分为AH,AL来兼容之前版本的数据 同理 BX,CX,DX.另外AH的H是high的意思,在左边高位,L是low的意思在右边是

汇编语言(王爽) 第3章寄存器(内存访问)

3.1 内存中的字 内存中的字是16位的,以2个内存单元存储 地址大的存高位(字的左边8位),地址小的存低位(字的右边8位) 字单元:存放1个字形数据的内存单元,由2个内存单元组成,共16位 3.2 DS 一个寄存器的名字,用来放数据段的段地址 mov 指令可以把数据转到寄存器,一个寄存器的内容转到另一个寄存器,内存单元(字单元)转到寄存器 但是一般会mov ax,1000h;mov ds,ax而不是直接mov ds,1000h 因为8086CPU不支持直接把内存单元的东西转到段寄存器上面 3.

汇编语言(王爽) 第5章[BX]和loop指令

mov ax,[0] 把一个内存单元给寄存器ax,内存单元长度2个字节,偏移地址0,段地址ds mov al,[0] 把一个内存单元给寄存器al,内存单元长度1个字节,偏移地址0,段地址ds so:要描述一个内存单元,需要1.ds和偏移地址2.内存单元长度 [bx]也表示一个内存单元,偏移地址在寄存器bx中罢了 我们用()表示一个寄存器或一个内存单元中的内容 ()中可以是寄存器,段寄存器,内存单元的物理地址 5.1 [bx] mov ax,[bx] 把段寄存器ds和偏移地址在bx中的内存单元的内