8086-x86汇编
Hello
柳家山头号矿工
如果你喜欢数学,那我们就是朋友!!!
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
x86汇编从实模式到保护模式-程序加载器
调试一天半,复刻成功!!!;文件名:Program_Loader.asm;文件说明:硬盘主引导扇区代码(加载程序);创建日期:2021-11-1;用户程序起始逻辑扇区号;段;Main:;设置堆栈;计算用户程序加载的段地址;设置程序读取的上文(先读取一个扇区,获取基本信息);利用基本信息,计算程序的总扇区数;(若剩余扇区数>0)读取剩余扇区;重置段表;跳转至用户程序入口;;application equ 10 ;用原创 2021-11-02 21:38:53 · 176 阅读 · 0 评论 -
nasm汇编:段的申明、$$、$
段的申明:section Segment_Name align=0_? vstart=1_?Segment_Name 表示段名0_? 表示对齐的字节数1_? 表示段内汇编地址的开始点缺省:未定义时的默认值$$:值为vstart,当vstart未定义时(vstart缺省),默认值为所属段相对于程序开头的位置$:值为vstart + 所在行与所在段的相对位移section data0 ;程序开头地址:0x00000000,已对齐不需要align,缺省vsta原创 2021-11-01 10:21:39 · 2241 阅读 · 0 评论 -
8086汇编-做1到100的加法并显示结果
环境:nasm,virtualbox代码如下:start_:xor ax,axmov cx,100@f:add ax,cxloop @fmov bx,0xb800mov ds,bxmov di,2000cmp ax,0 ;cmp看作减法指令jz s0mov bx,10s: ;ax不为零,则执行此处的代码mov dx,0 ;dx存被除数高位,ax存被除数低位div bx ;ax保存商,dx保存余数mov cx,ax ;商非零,则循环进行add dl,48 ;dl的A原创 2021-10-30 20:07:38 · 3885 阅读 · 2 评论 -
8086汇编-实验10-字符打印程序
效果如图:assume cs:codeparameters_stack segment ;程序断点参数传递 db 48 dup(0)parameters_stack endsraw_stack segment ;程序断点保存 db 48 dup(0)raw_stack endsalpha segment db 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' ;0~25 db 'abcdefghijklmnopqrstuvwxyz' ;26~51 db 'HI, WEL原创 2021-10-27 08:55:33 · 429 阅读 · 0 评论 -
8086汇编-实验9-字符打印
环境:DosBox 0.74-3,masm效果如图:assume cs:codestack segment db 16 dup(0)stack endsalpha segment ;+26 db 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' ;0~25 db 'abcdefghijklmnopqrstuvwxyz' ;26~51 db 'HI, WELCOME TO MASM! ' ;52~77 db 'I AM Cncdre FROM CHINA. '原创 2021-10-25 22:00:32 · 543 阅读 · 0 评论 -
8086汇编-实验8-jmp指令的理解
offset 标号:取标号处的地址mov 16位 offset 标号:取标号偏移地址mov 32位 offset 标号:取标号段地址:偏移地址assume cs:codecode segment mov ax,4c00h int 21h start: mov ax,0 ;ax=0 s: nop nop mov di,offset s mov si,offset s2 mov ax,cs:[si] mov cs:[di],ax s0: jmp short原创 2021-10-24 12:48:26 · 496 阅读 · 0 评论 -
8086汇编-实验7-制表
assume cs:codestack segment ;栈段 dw 0,0,0,0,0,0,0,0stack endsdata segment ;属性 db 1,'year',' num',' sum',' ave'data endsdata0 segment ;年份 076f db 1,'2000','2001','2002','2003','2004'data0 endsdata1 segment ;员工人数 db 1,4,11,16,20,25data1 ends原创 2021-10-23 07:50:58 · 329 阅读 · 0 评论 -
外部中断执行流程
设备->中断请求芯片->CPU->中断向量表(RAM)->中断程序1、设备向中断请求芯片发出中断请求2、中断请求芯片根据优先级排序选择响应优先级较高的中断3、根据响应的中断引脚在其内部存储器取与引脚对应位置的中断号并提交给CPU4、保存断点,CPU根据中断号在RAM中的中断向量表中寻找对应中断程序5、CPU开始执行中断程序6、中断程序执行完毕,恢复断点中断请求芯片8259A如下图:...原创 2021-10-22 18:47:00 · 3417 阅读 · 0 评论 -
8086汇编-实验6(微调)-小写转换大写
效果如下代码如下assume cs:codedata segment db '1. one ' db '2. two ' db '3. three ' db '4. four ' db '5. five ' db '6. six 'data endscode segment start: mov ax,data ;数据段地址 mov ds,ax mov bx,0h ;数据段基原创 2021-10-22 09:42:12 · 971 阅读 · 5 评论 -
8086汇编-实验5(微调)-用栈实现数据交换位置
初始状态:代码如下:assume cs:code,ds:data,ss:stackdata segment dw 0123h,1234h,2345h,3456h,4567h,5678h,6789h,7890hdata endsstack segment dw 0,0,0,0,0,0,0,0stack endscode segment s: mov sp,16 push data:[0] push data:[2] pop data:[0] pop data:[2] ;原原创 2021-10-21 12:32:16 · 534 阅读 · 0 评论 -
8086汇编-实验4-[bx]和loop的使用
结果如下:代码如下:code segmentassume cs:codestart: mov ax,0h mov ds,ax ;段地址初始化 mov bx,200h mov di,0h ;偏移地址初始化 mov al,0h ;待写入数据 mov cx,40h ;循环64次 s: mov [bx+di],al ;写入内存 inc di ;偏移地址自加1 inc al ;待写入数据自加1 loop s mov ax,4c00h int 21hcode endsen原创 2021-10-21 11:53:34 · 183 阅读 · 0 评论 -
猜想:汇编指令push和pop对sp的处理顺序缘由
push ax等价于sub sp,2mov ds,ssmov si,spmov [si],almov [si+1],ahpop ax等价于mov ds,ssmov si,spmov al,[si]mov ah,[si+1]add sp,2push指令sp先自减2再传送数据的原因:两条指令mov [si],almov [si+1],ah[si-2]指向目的地址,可直接合并为mov ss:sp,axpop指令sp先传送数据再自加2的原因:两条指令mov al,[si].原创 2021-10-20 12:03:36 · 2730 阅读 · 4 评论 -
8086汇编-实验3-编程、编译、链接、跟踪
汇编程序编写:assume cs:codecode segmentmov ax,2000hmov ss,axmov sp,0add sp,10pop axpop bxpush axpush bxpop axpop bxmov ax,4c00hint 21hcode ends寄存器:ax bx ss spax, bx, ss, sp, 2000:10 x, 2000:12 ystep0:mov ax,2000hax=2000h, bx, ss, sp, 2000:10 x原创 2021-10-20 09:55:37 · 150 阅读 · 0 评论 -
8086汇编-实验1、2-debug调试命令
1、R命令查看CPU寄存器的内容-r查看所有寄存器的内容-r reg改变制定寄存器中的内容2、D命令查看内存中的内容-d查看内存中的128个内存单元-d 段地址:偏移地址可查看指定地址开始的共128个内存单元的内容-d 段地址:偏移地址 结尾偏移地址可查看指定地址开始到结尾偏移地址的内容3、E命令改写内存中的内容(机器码形式),修改前可用d先行查看内容-e 段地址:偏移地址输入新的数据回车接着输入下一个数据或者直接回车跳过当前数据的修改,所有数据修改完成后,按回车结束E命令原创 2021-10-20 08:50:36 · 363 阅读 · 0 评论 -
8086CPU-汇编指令ret与call
一、ret指令:通过栈中的数据(ss:sp)修改ip(cs:ip)的内容,实现近转移ret指令等价于pop ip(ip)=((ss)*16+(sp))(sp)=(sp)+2retf指令:通过栈中的数据(ss:sp)修改cs和ip中的内容,实现远转移retf指令等价于pop ippop cs(ip)=((ss)*16+(sp))(sp)=(sp)+2(cs)=((ss)*16+(sp))(sp)=(sp)+2二、call s指令:将当前ip(cs:ip)的值压入栈(ss原创 2021-09-23 08:41:40 · 953 阅读 · 0 评论 -
对移码满足二进制减法的小思考
对加减法另一种写法:a+b=(a-“0”)+(b -“0”)+“0”=(a+b)-“0”a-b=(a-“0”)-(b -“0”)+“0”= (a-b)-“0”此处的“0”指的是序列的零元素讨论之前我们先观察一下最平常的十进制减法及它的编码有哪些特性为了便于讨论,我们就看看十进制减法吧可以看到这里的序列右移一格+1,这表明它在十进制整数序列上是连续的并且任取两个数,这两个数的十进制之差=这两个数之差的十进制二进制没有天然的负数,而这个十进制序列含有负数,接下来我们再构造一个序列可以看到与原创 2021-09-24 23:10:22 · 359 阅读 · 0 评论 -
8086CPU写汇编的规则
assume cs:程序入口标号标号1 segment数据块……标号1 ends标号2 segment…………标号2 ends程序入口标号 segment代码块……x:代码块……程序入口标号 endsend 标号x;程序入口标号:数据块(代码块)在内存中的段地址(标号·16+0000h):数据块(代码块)在内存中的起始地址设数据块(代码块)的大小为x字节则数据块(代码块)的终止地址为((标号+x / 16+x % 16 && 1)·16-0001h):原创 2021-09-20 09:13:33 · 204 阅读 · 0 评论 -
8086CPU汇编寻址写法
物理地址:xxxxxh(20位)段地址:xxxxh(16位)偏移地址:yyyyh(16位)物理地址=段地址·16+偏移地址=xxxx0h+yyyyh程序指令物理地址=cs:ip(指向指令开始执行的位置)栈物理地址=ss:sp(指向栈顶)数据物理地址(指向数据读/写的位置)ds:dids:siss:bp(xxxxxH)偏移地址[xxxxh][di][si][bx][bx+xxxxh][di+xxxxh][si+xxxxh][bp+di+xxxxh][bp+si+xxxx原创 2021-09-13 12:38:51 · 630 阅读 · 0 评论 -
8086CPU跳转指令
跳转原理:修改cs:ip 或 ip的值指令格式:指令 标号跳转分类:段内跳转段间跳转(短转移:-128到127、近转移-32768到32767,补码表示)跳转指令分类:1、无条件跳转 jmp(段间、段内(短转移、近转移))2、条件跳转 jcxz(短转移)3、循环指令 loop(短转移)4、过程(待补充)5、中断(待补充)操作符 offsetmov ax,offset 标号意为取标号处的偏移地址并放入ax例:assume cs : codecode segmentstar原创 2021-09-19 07:40:07 · 1851 阅读 · 0 评论 -
8086CPU寄存器介绍
内存中存放一个字的数据的方式:高位放入高地址,低位放入低地址例:mov [12300H],1234H1230:0000 34H1230:0001 12H……通用寄存器有以下三种数据寄存器:ax,bx,cx,dx基址寄存器:sp,bp变址寄存器:si,di段寄存器:cs,ds,es,ss控制寄存器:ip,flages数据寄存器分高位/低位:_h/_lax:称为累加寄存器,算术运算的主力,可用于临时存放数据bx:称为基址寄存器,常用于地址引索,一般情况可用于临时存放数据cx:称为原创 2021-09-13 14:55:58 · 1459 阅读 · 0 评论 -
8086标志寄存器介绍及作用(未完)
标志寄存器结构:寄存器分类:状态标志:CF(无符),PF,AF (无符),ZF,SF (有符),OF (有符)控制标志:TF,IF,DF1、CF标志(carry flag)进位标志位记录无符号运算时的进位或借位,便于多位数的加减运算CF=NC/0,说明上一步操作无进位或借位CF=CY/1,说明上一步操作有进位或借位2、PF标志(parity flag)奇偶标志位记录上一次操作结果二进制位中1的个数PF=PO/0,1的个数为奇数个PF=PE/1,1的个数为偶数个3、AF标志(au原创 2021-09-21 11:10:07 · 4550 阅读 · 1 评论 -
8086CPU常见汇编指令、debug命令
汇编指令:1、mov x,yx,y:寄存器,数据寄存器,寄存器寄存器,内存物理地址内存物理地址,寄存器寄存器,内存偏移地址(此时段寄存器默认为ds)内存偏移地址,寄存器(此时段寄存器默认为ds)内存偏移地址,数据(此时段寄存器默认为ds)段寄存器,寄存器寄存器,段寄存器2、add x,yx,y:寄存器,数据寄存器,寄存器寄存器,内存物理地址内存物理地址,寄存器寄存器,内存偏移地址内存偏移地址,寄存器3、sub x,yx,y:寄存器,数据寄存器,寄存器寄存器,内原创 2021-09-13 12:41:45 · 3544 阅读 · 0 评论 -
x86汇编-2(第五章)nasm汇编基础知识、指令、显存、bochs调试
一、汇编程序一般人为地分为代码段与数据段,不同的段的内存分配总是16字节的倍数,公式如下设数据段或代码段为x字节,分配内存为:(x/16+x%16)*16字节标号:标识当前位置的偏移地址,如果当前是数据段则方便引用,如果是代码段则方便跳转标号不加冒号还表示后面的每一个数据占据内存大小相同,可类似于数组的使用指令:mov:传送指令add:加法指令div:除法指令指令的两操作数不能都是内存地址伪指令:db(define binary),dw(define word),dd(define do原创 2021-09-30 16:53:50 · 710 阅读 · 0 评论 -
x86汇编-1(第三章—第四章)虚拟硬盘基本信息,虚拟硬盘的写入,bochs调试
一、硬盘C:磁道(Cinder,从0开始)H:磁头(Heads,从0开始)S:扇区(Sectors per track,从1开始)每一张盘有两个面对应两个磁头磁盘存取顺序:从上到下(磁头变化),由外到内(磁道变化)CHS硬盘内存表示法:(C,H,S)LBA硬盘内存表示法:C * 总磁头数 * 单磁道扇区数 + H * 单磁道扇区数 + S - 1二、写入bin文件在记事本上写好汇编代码汇编代码需满512Bit(用0填充),且最后2字节以0x55,0xAA结尾用nasm编译为bin文件原创 2021-09-29 22:10:59 · 515 阅读 · 0 评论 -
8086CPU加电的第1跳与ROM-BIOS
补充intel8086CPU来说,它有1M的寻址能力,编址由低到高0x00000-0xFFFFF顶端的64K编址0xFFFF0-0xFFFFF,用于存储ROM-BIOS程序底端640K编址0x00000-0x9FFFF用于随机存取-DRAM中间一段提供给外围的I/O设备使用下面为转载内容,原创网址一、第一条指令的地址在用户按下计算机电源开关之后,CPU会自动的将其CS寄存器设定为0xFFFF,将其IP寄存器设定为0x0000。由于CS:IP指出了下一条指令的地址[1],因此CPU会跳到0xFF原创 2021-09-30 11:58:41 · 990 阅读 · 0 评论 -
x86汇编-1(第一章—第二章)8086处理器基本情况
第一章:进制1、二进制(Binary):0、1十进制(Decimal):0、1、…、9十六进制(Hex、0x):0、1、……、9、A、……、F第二章:处理器、内存、指令、地址1、处理器(CPU):控制单元、算术单元、寄存器控制单元(CU):给各个部件给予控制信息,使其在恰当的时间做恰当的事儿运算单元(ALU):负责数值运算与逻辑运算8086寄存器(SEG):数据临时的存放点,分为控制寄存器、状态寄存器8086的寄存器长度为1字(2字节、16位),ax、bx、cx、dx可分割为更小的半字原创 2021-09-29 09:24:02 · 1054 阅读 · 0 评论 -
x86汇编-0
为了学操作系统,学了8086汇编学完8086汇编之后,自信满满的开始了操作系统之路听前面几节课,嗯还可以,都学过啊听到进程线程,嗯有点难,不过还可以听直到开始在虚拟机上实验操作……还是老老实实再学一下x86汇编吧...原创 2021-09-28 19:27:53 · 108 阅读 · 0 评论
分享