8086汇编语言
16位汇编语言
zy010101
会写一点代码
展开
-
8086汇编语言——向显示缓冲区中写入数据
;在屏幕上显示Welcome to masm!字符串。;显示三行,颜色不同。这需要通过给显示缓冲区写入内容来实现。;DOS显示模式是80×25,表示25行,每行80个字符。;每个字符占2字节,高字节存放字符属性,低字节存放ASCII。;请不要debug本程序,这样是看不到结果的。请直接在DOS环境下运行本程序assume cs:codedata segment db 'Welcome to masm!' db 02h,71h,0cah ;控制字符显示的属性d.原创 2020-09-28 11:17:26 · 3475 阅读 · 3 评论 -
8086汇编语言——一个很骚的程序
;分析下面这个代码的骚操作,看看能能否成功返回。assume cs:codecode segment mov ax,4c00h int 21hstart: mov ax,0 ;程序将从这里开始执行 s: nop ;nop什么都不干,但是它需要1个时钟周期。 nop mov di,offset s ;di指向s这个位置 mov si,o.原创 2020-09-28 11:14:15 · 4408 阅读 · 0 评论 -
8086汇编语言——双层循环的使用
;编程,将data段的每个单词的前四个字母改写为大写。assume cs:codestack segment dw 10 dup(10)stack endsdata segment db '1. display ' db '2. brows ' db '3. replace ' db '4. modify 'data endscode segmentstart: mov ax,stack .原创 2020-09-28 11:12:04 · 2096 阅读 · 0 评论 -
8086汇编语言——处理字符串
;将'basic'转成大写'BASIC';将'ASM'转成小写'asm'assume cs:codedata segment db 'basic' db 'ASM'data endscode segmentstart: mov ax,data mov ds,ax ;设置ds指向data mov bx,0 ;设置偏移地址 mov cx,5 ;循环5次 s1: mov al,[bx].原创 2020-09-28 11:09:21 · 2197 阅读 · 3 评论 -
8086汇编语言——使用数据段和栈段
;编写程序将data1段和data2段中的字节型数据依次相加,将结果存在data3段中。;ds保存data1的段地址,es保存data2的段地址,ss保存data3的段地址。;db用来定义字节型数据,这里定义了5个连续的字节型数据。assume cs:codedata1 segment db 1,2,3,4,5 data1 endsdata2 segment db 6,7,8,9,10data2 endsdata3 segment db 0,0,.原创 2020-09-28 11:04:00 · 5293 阅读 · 0 评论 -
8086汇编语言——操作内存中的数据
;编程计算0000h:0000h内存单元中数据乘以3的结果,结果保存在dx中。;本次计算的一个字节单元中的数据,它是8位的。所以需要使用8位的寄存器取值。;这个内存单元中的数据最大可能是255,255×3的结果会超出8位,所以运算的时候,需采用16位寄存器。;当然,最终结果也要保存在16位寄存器之中。assume cs:codecode segment mov ax,0000h mov ds,ax ;段地址 mov bx,0000h .原创 2020-09-28 10:49:10 · 4826 阅读 · 0 评论 -
8086汇编语言——循环的使用
;编程计算2^12,结果保存在dx中。assume cs:codecode segment mov ax,1 mov cx,12 ;循环次数s: add ax,ax ;循环体 loop s mov dx,ax ;将结果保存在dx之中。 mov ax,4c00h int 21hcode endsend同样,在Dosbox中Debug该程序,可以看到结果如下图所示:DX=1000H=4096D...原创 2020-09-27 21:01:25 · 2081 阅读 · 0 评论 -
8086汇编语言——交换寄存器中的内容
;交换ax和bx中的值assume cs:code ;假设cs的值是codecode segment ;定义一个段的开始 mov ax,2000h mov ss,ax mov sp,0 add sp,10 ;在Debug中跟踪执行,可以看到mov ss,ax和mov sp,0是必须一起执行的,不能打断。 mov ax,1 ;初始化ax和bx mov bx,2 push ax .原创 2020-09-27 20:55:37 · 5053 阅读 · 0 评论 -
8086汇编格式
1.伪指令segment和ends是成对出现的伪指令,它们必须有,它们的功能是定义一个段,segment说明段开始了,ends表示段结束了。通常的使用格式是:段名 segment.........段名 endsend是汇编结束的标记,也是一个伪指令。用来告诉编译器汇编结束。assume是假设某一个寄存器和某一个段相关联的。...原创 2020-08-23 17:06:21 · 626 阅读 · 0 评论 -
8086段寄存器
8086的访问内存的时候:物理地址=段地址×16+偏移地址,这个段地址由段寄存器来提供。8086有4个段地址寄存器,分别是CS,DS,ES,SS。其中CS是最为关键的,因为CS:IP指示了CPU需要读取的地址。IP是指令指针寄存器,在这里就作为偏移地址。也就是说:在8086CPU中,任意时刻,CPU都会把CS:IP指向的内容当作指令来执行。每读取一次之后,IP中的值会自动增加(增加的长度就是所读取到的指令的长度),以便CPU读取下一个指令。8086在上电或者复位的时候,CS被设置为0xFFFFH,IP被原创 2020-08-21 14:20:20 · 2922 阅读 · 0 评论 -
8086的寻址方式
8086是16位的微处理器,它拥有16根数据总线,它的寄存器也是16位的,这意味着8086一次性能够的处理的数据是16位。同时,8086有20根地址总线,可寻址最大1MB的内存。但是8086一次最多处理16位数据,内存地址可达20位,这意味着8086不能一次性确定内存地址。8086为了解决这个问题,在内部采用两个16位地址合成的方法来形成一个20位的地址。当8086读写内存的时候进行以下的步骤。地址加法器产生物理地址方式:物理地址=段地址×16+偏移地址。更常见的说法是段地址左移4位之后加上偏移原创 2020-08-20 22:28:54 · 1418 阅读 · 2 评论 -
8086的通用寄存器
8086是16位的微处理器。这意味着,它的所有寄存器也都是16位的,它能一次性处理16位数据。它有4个通用寄存器,分别是AX,BX,CX,DX。他们逻辑结构是一致的,下图展示了AX的结构。不过这四个寄存器都可以分别作为两个独立的8位寄存器。例如AL作8位寄存器的时候,一旦数据超过FFH就会被丢弃或者是存放在进位位中,而不是把进位位放在上图8这个位置处。AX分为AH和AL;BX分为BH和BL; CX分为CH和CL; DX分为DH和DL;(H代表高8位,L代表低8位)从图中可以看到数据在寄.原创 2020-08-20 17:13:27 · 2037 阅读 · 0 评论