
汇编
汇编可以帮助我们更好的理解计算机的运行原理。
请叫我大虾
这个作者很懒,什么都没留下…
展开
-
汇编:中断过程
中断过程如下: 1. 取得中断类型N 2. 保存标志位寄存器 ====》栈 pushf 3. 将标志位寄存器的第8位(TF), 第9位(IF) 设置为0. 4. push cs 5. push ip 6. cs = N*4+2地址的内容, ip = N*4地址的内容 iret指令相当于执行了 pop ip, pop cs, popf指令. ...原创 2019-01-13 18:35:31 · 1271 阅读 · 0 评论 -
汇编:中断向量表
当程序出现错误,可能会触发中断程序。中断向量表维护的就是处理相应错误的程序地址。0号处理中断信息的程序地址1号处理中断信息的程序地址2号处理中断信息的程序地址 0: 0*4地址的内容 = IP0: 0*4+2地址的内容 = CS 1: 1*4地址的内容 = IP1: 1*4+2地址的内容 = CSassume cs:code, ds:data, ss:...原创 2019-01-13 17:36:28 · 4117 阅读 · 0 评论 -
汇编:DF标志位
DF: UP(向上) DN(down 向下)assume cs:code, ds:data, ss:stackdata segment db 128 dup(128)data endsstack segment db 128 dup(128)stack endscode segment start: mov dx, stack mov ss, dx m...原创 2019-01-13 11:19:46 · 3607 阅读 · 0 评论 -
汇编:cmp
assume cs:code, ds:data, ss:stackdata segment db "Beginer's All - purpose symbolic instraction Code.",0data endsstack segment db 128 dup(0)stack endscode segment start: mov dx, stack...原创 2019-01-12 18:05:51 · 1934 阅读 · 0 评论 -
汇编: adc指令
add ax, dx; ---> ax = ax+dxadc ax, dx; ---->ax = ax+dx+carry(进位)sub ax, dx; ----> ax = ax - dxsbb ax, dx; ------> ax = ax - dx - carry assume cs:code, ds:data, ss:stack...原创 2019-01-12 16:41:03 · 8516 阅读 · 0 评论 -
汇编:OF溢出标志位
判定CF时,把两者当成无符号数,看是否进位 判定OF时,把两者当成有符号数,看是否进位或借位 OF: OV(overflow) NV(not overflow)原创 2019-01-12 10:59:24 · 4317 阅读 · 1 评论 -
汇编:SF符号标志位
SF: NG(negative)负数 PL(positive)整数原创 2019-01-11 23:54:44 · 6203 阅读 · 0 评论 -
汇编:PF标志位
PF:奇偶性 PE(even):偶数 PO:(odd)奇数。 二进制中的1的个数. 比如: 00000011B--3,PF标志就是PE。原创 2019-01-11 23:41:36 · 6491 阅读 · 0 评论 -
汇编:ZF(zero flag)标志位
ZF: ZR(ZERO) NZ(NOT ZERO)原创 2019-01-10 22:56:26 · 5825 阅读 · 0 评论 -
汇编:CF(carry flag)标志位
F:flagCY: carry yes NC:not carryCF只跟 add等运算指令有关。 mov,push等移动指令不会改变CF。原创 2019-01-10 22:40:14 · 4077 阅读 · 0 评论 -
汇编:从键盘读取字符
键盘上有芯片,主板上有端口. 假设在键盘上按了字母‘a’,‘a’会先被保存在键盘上的芯片中。(键盘上有跟数据线与主板的一个口子连在一起。主板上的这个口子叫做端口). 然后‘a’通过数据线发送到主板的端口中。cpu就会通过数据线,地址线,控制线读取端口中的字符‘a’ cpu从内存中读取内容,是通过 "mov 寄存器,内存地址" 的方式. 那么怎么读取硬件(端口)的内容呢? 通过...原创 2019-01-10 19:45:53 · 1977 阅读 · 0 评论 -
汇编: mul乘法指令
两个相乘数,要么都是8位,要么都是16位。 8位乘法,16位乘法。如果是8位,一个数字默认存放在al中,另外一个数字存放在其他8位寄存器中或者字节型内存单元中。mul 8位寄存器 ;结果存放在ax中mul byte ptr ds:[0] ;结果存放在ax中 如果是16位,一个数字默认存放在ax中,另外一个数字存放在其他16位寄存器...原创 2019-01-01 21:45:59 · 24535 阅读 · 1 评论 -
汇编:call指令的应用
assume cs:code, ds:data, ss:stackdata segment db 128 dup(0)data endsstack segment db 128 dup(0)stack endscode segment start: mov ax, data mov ds, ax mov ax, stack mov ss,ax ...原创 2018-12-30 21:59:24 · 1227 阅读 · 0 评论 -
汇编:call指令
1. call 标号, (机器码中包含了位移) 执行call指令,相当于执行下面两条指令 push ip jmp near ptr 标号 2. call far ptr 标号, (机器码中包含转移的目的地址) push cs(call指令的下一条指令的cs地址) push ip(call指令的下一条指令的ip地址) jmp fa...原创 2018-12-28 22:48:20 · 4323 阅读 · 1 评论 -
汇编:ret以及retf指令
执行ret指令,相当于执行pop ip执行retf指令,相当于执行pop ip,pop cs assume cs:code, ds:data, ss:stack ; 设置数据段data segment db 128 dup (0)data ends ; 设置栈段stack segment stack db 128 dup (0)stack ends ; 设置代...原创 2018-12-28 00:04:29 · 2647 阅读 · 0 评论 -
汇编:转移目的地址在内存中
assume cs:code, ds:data, ss:stack; 设置数据段data segment db 128 dup (0)data ends; 设置栈段stack segment stack db 128 dup (0)stack ends; 设置代码段code segment start: mov ax, stack mov ss, ax mov...原创 2018-12-23 21:35:37 · 473 阅读 · 0 评论 -
汇编:转移目的地址在机器码或寄存器中
assume cs:code, ds:datadata segment db 128 dup (0)data endscode segment start: mov ax, data mov ds, ax jmp far ptr s mov ax, 1000H mov bx, 1000H db 250 dup (0) s: mov ax...原创 2018-12-23 21:06:09 · 490 阅读 · 0 评论 -
汇编:JCXZ条件转移指令
jcxz = j:jmp cx:cx寄存器 z:zero(当cx寄存器中的值为0时,进行跳转)jcxz指令与loop指令正好相反.loop指令:当cx寄存器的值不等于0时,才进行跳转. 所有的条件转移指令都是短转移,位移范围是(-128~127), 经过编译后,机器码中包含了位移的范围。 EBXX, XX就是转移的字节长度, 这个XX是在编译器编译时候计算的。计算公式是:...原创 2018-12-23 18:22:31 · 3144 阅读 · 0 评论 -
汇编:JMP指令原理
cpu执行指令步骤: 1. 从cs和ip所组合出来的地址读取指令,将指令存放到指令缓存器中 2. 改变ip寄存器,ip = ip+所读指令的字节数 3.执行指令缓存器中的内容,跳转到第1步assume cs:code, ds:datadata segment db 128 dup (0)data endsstack segment db 128 dup (...原创 2018-12-23 16:26:11 · 7112 阅读 · 0 评论 -
汇编: OFFSET操作符
OFFSET 找到标记位置的操作符assume cs:code, ds:datadata segment db 128 dup (0) data endsstack segment db 128 dup (0)stack endscode segment start: mov ax, bx mov ax, data mov ds, ax mov ...原创 2018-12-23 15:48:02 · 23029 阅读 · 5 评论 -
汇编: dup伪指令
dup可以重复定义前面的数据 assume cs:code, ds:datadata segment db 10 dup (0) ; 连续定义10个字节型的0 db 1,2,3,4,5,6 db 10 dup ('a') db 6,5,4,3,2,1 db 4 dup('123','abc')data endscode segment start...原创 2018-12-21 00:30:40 · 18545 阅读 · 2 评论 -
汇编:dd 伪指令
db: define byte 8bitdw: define word 16bitdd: define dword(double word), 双字形 32bitassume cs:code, ds:data, ss:stackdata segment dd 100001 dw 100 db 0data ends...原创 2018-12-20 12:42:02 · 4543 阅读 · 0 评论 -
汇编:div 除法指令
assume cs:code, ds:data, ss:stackdata segment db 0,1,2,3,4,5,6,7data endsstack segment dw 0,0,0,0,0,0,0,0stack endscode segment start: mov ax, data mov ds...原创 2018-12-18 22:51:39 · 4187 阅读 · 0 评论 -
汇编:数据长度
1. 通过寄存器可以确定数据的长度2. 也可以通过 word ptr, byte ptr确定数据的长度.assume cs:code, ds:data, ss:stackdata segment db 0FFH, 0FFH, 0FFH, 0FFH, 0FFH db 0FFH, 0FFH, 0FFH, 0FFH, 0FFH db 0FFH, 0FFH, 0FF...原创 2018-12-18 22:04:05 · 1205 阅读 · 0 评论 -
汇编:以字符形式给出数据
用单引号括起来,表示字符assume cs:code , ds:datadata segment db 65,66,67,68,69 db 'abc123 lmn' data endscode segment start: mov ax, data mov ds, ax mov bx, 0 ...原创 2018-12-16 11:56:15 · 380 阅读 · 0 评论 -
汇编: and,or逻辑运算指令
assume cs:codecode segment ; 逻辑运算 按照二进制位运算 start: mov ax,0 mov al, 00001111B and al, 11110000B ; 00000000B ...原创 2018-12-16 10:57:39 · 4206 阅读 · 0 评论 -
汇编: 更灵活的定位内存地址的方法
bx是偏移地址寄存器。同样的, si,di也是偏移地址寄存器。 这样使用了si,di可以更灵活的定位内存地址。assume cs:codecode segment start: mov bx,0 mov si,0 mov ax,ds:[si] inc si...原创 2018-12-16 10:41:59 · 332 阅读 · 0 评论 -
汇编: 在代码中安排自己定义的数据,栈空间
assume cs:codecode segment dw 1,2,3,4,5,6,7,8 ; 我们自定义的数据 不是我们自定义的指令 ; d:define w:wordstart: mov bx,0 mov ax,0 mov cx,8; 将数据相加addNumber: add ax,cs:[bx] add bx,2...原创 2018-12-09 14:31:05 · 639 阅读 · 0 评论 -
汇编: loop指令
assume cs:codecode segment mov ax,2000H mov ds,ax mov bx,1000H addNum: mov ds:[bx],dl # addNum是一个标识,存放的是 mov ds:[bx], dl指令的地址 inc dl inc bx jmp addNum # 跳转到 addNu...原创 2018-11-27 00:44:14 · 756 阅读 · 0 评论 -
汇编: 使用[bx]代替[0]获取内存数据
inc指令: inc是increase的缩写 如下: mov dl,0BEH 如果数据是字母开头,那么字母前面要加上0,这是汇编编程规定.原创 2018-11-26 23:01:12 · 403 阅读 · 0 评论 -
汇编:内存段的安全
随意的在内存段中写入数据,可能就会修改其他程序或系统程序的数据,这样就会造成程序或系统崩溃。这是件很危险的事情。那么我们怎么取得安全的内存段呢? 1. 在 0:200H~0:2FFH, 一般情况下,没有程序会使用这段内存区域。但块内存区域只有256个字节,一般情况下都不够我们使用。 2. 由操作系统给我们分配内存。在操作系统环境中,合法的通过操作系统取得的内存...原创 2018-11-25 17:40:39 · 353 阅读 · 0 评论 -
汇编:栈
栈是一段连续的内存单元,也就是一段连续的内存地址。 需要特殊的访问形式--才能访问栈。 栈的模型就像一个箱子,通过"入栈","出栈"操作栈这个箱子, 这个箱子还有一个标记"栈顶",永远指向栈的顶部。 从内存角度看: 入栈: push, 将16位寄存器或者内存中的字型数据 ----->栈顶标记的上面。 出栈: pop 将栈顶标记所标识的字型...原创 2018-11-24 11:09:40 · 1423 阅读 · 0 评论 -
汇编(8086cpu): 字节数据(byte)与字型数据
字符数据由2bytes组成。 在dosbox的 2000:0内存中一次输入指令: mov ax, 1234 mov bx, 5678 mov cx,9876 mov dx,4321 那么这些数据在内存中的内容如下: 一个字型数据(如 1234H)存放在内存中,由2个连续的地址的内存单元组成。 高地址内存单元存放字型数据的高位...原创 2018-11-22 16:50:22 · 7518 阅读 · 1 评论 -
汇编(8086cpu): ip寄存器与指令的关系
指令的执行过程: 1. cpu从cs:ip所指向的内存单元读取指令,存放到指令缓存器中。 2. ip=ip+所读指令的长度,从而指向下一条指令。 3. 执行指令缓存器中内容,回到步骤1. 8086cpu不支持 mov cs, ax 或 mov cs, 5等修改cs,ip寄存器的内容.要想修改,就必须通过jmp指令修改cs,ip寄存器的内容. ...原创 2018-11-19 22:09:20 · 2123 阅读 · 0 评论 -
汇编:源文件asm, exe可执行文件
asm文件是汇编源代码文件。汇编源代码由一下三部分组成 1. 汇编指令 被编译器翻译成0,1的机器指令(机器码),然后由cpu执行。 2. 伪指令 由编译器执行 3. 符号体系 由编译器执行 exe可执行文件,不止包括了我们整个程序。还包括了描述信息,系统就是根据这些描述信息,进行相关的设置。 data segment...原创 2018-11-25 19:47:25 · 6519 阅读 · 0 评论 -
汇编:ds寄存器--数据段
mov ax,[0] // ax表示取两个字节的数据, [0]表示偏移地址。 mov al, [1] mov ax,[2] 把 ds指向的内存中的数据存到ax或al中. []表示偏移地址. 并且根据 ax,al判断取几个字节.改变ds寄存器的值 将ax寄存器的值存到ds所指向的内存中。 将al寄存器的值存到ds所指向的内存中。...原创 2018-11-22 23:08:39 · 4516 阅读 · 0 评论 -
汇编(8086cpu): 地址寄存器
8086cpu结构图 存放段地址的寄存器就是段地址寄存器,存放偏移地址的就是偏移地址寄存器.段地址寄存器: DS, ES, SS, CS偏移地址寄存器: SP,BP,SI,DI,IP, BX(bx也是一种数据,所以bx也可以存放地址信息)以上地址寄存器都是16位 cs:ip读取的内存地址中的内容是指令,而不是数据。 CS(codesegment)——16位的...原创 2018-11-18 20:34:21 · 2194 阅读 · 0 评论 -
汇编(8086cpu): AX,BX,CX,DX寄存器
AX,BX,CX,DX寄存器这四个寄存器也被称为通用寄存器.一般用来存放数据,一个寄存器可以存放16bit,也就是2bytes. 所以也被称为16位寄存器。 什么特殊的地方导致这四个寄存器和其他寄存器不一样呢? 是因为这四个寄存器可以被分为两个8位寄存器,比如 AX = AH + AL, BX = BH+BL, CX = CH + CL, DX = DH...原创 2018-11-17 21:57:52 · 11215 阅读 · 0 评论 -
汇编:端口
cpu通过内存地址访问内存,显存等内存. 那么是不是通过内存地址访问鼠标, 键盘,音箱,当然不是了.cpu通过端口(port)访问这些外部资源。原创 2018-11-17 21:30:51 · 521 阅读 · 0 评论 -
汇编:内存地址为什么从0开始?等问题
内存地址的最小单元是byte(字节) 1byte = 8bit, 1kb = 1024byte, 1mb = 1024kb, 1gb = 1024mb 内存地址为什么从0开始? 地址线决定了cpu能够找到多大的地址,这就是寻址能力. 如果只有1根地址线, 那么只能找到0,1两个地址。 如果只有2根地址线, 那么只能找到00,01,10,11四个地址。...原创 2018-11-17 11:13:34 · 2842 阅读 · 0 评论