汇编语言(第3版)王爽

一、基础知识

mov ax,bx把BX内容送到AX中。汇编语言有3类指令,汇编指令、伪指令,其他符号。CPU通过地址总线、控制总线、数据总线实现数据的读写。数据总线的宽度决定了CPU和外界的数据传送速度。汇编指令是机器指令的助记符,同机器指令一一对应,只是写法不同而已。主存是RAM,一般显卡有显卡RAM。CPU在操作物理器件如显卡、网卡等时,实际上是这些设备都在物理存储器中有对应的空间,CPU操作的是他们对应的这段空间(在其中读写数据)。

二、寄存器

对8086CPU,其寄存器都是16位的,AX,BX,CX,DX用来存放一般性的数据,被称为通用寄存器,为兼容其上一代CPU中寄存器为8位的情况,这四个寄存器都可分为两个可独立使用的8位寄存器使用,由X分为H和L,如AX可分为AH和AL。16进制也可直接加,如4E20+1406=6226H,如原来AX中是00C5H,经过add al,93H,al与C5H相加得到158H,然后高位1丢失(只是寄存器不能保存,但CPU并不真是丢弃这个进位值)。进行数据传送或运算时,两个操作对象的位数应一致,如mov ax,bl有问题,mov al,100H是将一个高于位的数存放到8位寄存器中,也有问题。8086CPU的上一代8080、8085等是8位机,8086有20位地址总线达到1MB寻址能力,8086CPU又是16位结构,它实际是两个16位地址合成的方法来形成一个20位的物理地址,物理地址=段地址16(左移4位)+偏移地址,应用到CPU寻址上,段(SA)16+偏移(EA)找到对应内存,因此段的起始地址是16的倍数,偏移为16位,因此大小为64KB,可根据需要将地址连续、起始地址为16的倍数的一组内存单元定义为一个段。8086CPU有4个段寄存器,CS、DS、SS、ES,CS为代码段寄存器,IP为指令指针寄存器,在8086PC机中,设CS内容为M,IP内容为N,则8086CPU将从内存M*16+N单元开始读取一条指令并执行即CS:IP中的指令作为当前指令,从CS:IP中读取的指令放入指令缓冲器,IP在操作过程中会自加,8086CPU加电启动后CS和IP被设置为FFFFH和0000H。 mov可改变通用寄存器的值,其指令被称为传送指令,但不能改变CS、IP中的值,他们需要转移指令,如jmp,可用jmp 段地址:偏移地址,若只改IP用jmp 某一合法寄存器,如jmp ax,在Debug下,查看内存时对应ASCII会显示,如果对应无可显示内容,如0AH,则会可能会显示为...(点点点)。

三、寄存器(内存访问)

DS寄存器用来访问数据的段地址。如mov bx,1000H mov ds bx mov al,[0]相当于把10000H的数据读到al中,其中[0]是内存单元的偏移,其段地址会从ds中找,因为数据不能直接mov到段寄存器中,所以要用通用寄存器中转,但内存单元,如[0]可直接到段寄存器。除mov,操作还有add,sub,jmp。 在基于8086CPU编程时,可将一段内存当作栈来使用,push,pop,其入和出都是以字为单位的,如以10000H~1000FH内存用作栈,压栈时以10000H为顶,段寄存器SS存放栈顶的段地址,即10000H,寄存器SP存放偏移地址,任意时刻SS:SP指向栈顶,入栈时栈顶从高向低地址方向增长,当栈为空时,不存在栈顶,SS:SP只能指向栈的最底部单元下面的单元,如一个空栈先压入再pop,则之前的数据会依然存在,但它们已不在栈中(可直接用地址访问到但不能用栈操作),再次push会覆盖掉这些内容,对栈CPU并未设置越界保护如push,pop过头,可自己判定,push,pop的对象可是通用、段寄存器及内存(如设置ds后,push [0]),如要清空AX中内容,用sub ax, ax而不用mov ax, 0因为后者的机器码为3个字节而前者只用2个,除此外还有and,xor(指令短且最快),压栈时是SP先减2,再压栈的,可根据空栈时压栈想象,对一个大小设定为64K的栈,如栈满了还继续压栈,则栈顶将环绕,覆盖原来栈底的内容,段是自己定义的,对一段内存,可以既是代码既是存储空间,又是数据存储空间还可是栈空间。

四、第一个程序

codesg和ends是一对成对使用的伪指令,其功能是定义一个段,需要也一个段名,至少有一个代码段。end伪指令标识整个程序结束,assume伪指令假设某一段寄存器和程序中的某一个段相关联,如assume cs:codesg将自定义的代码段codesg和cs联系起来,mov ax,4c00H int 21H用于程序返回。

五、[BX]和loop指令

[bx]表内存单元的偏移,约定符号idata表常量。inc bx表bx中的内容加1。loop 标号,cx里是执行次数,标号:指令。可mov ax,[bx]也可mov al,[bx]。在汇编源程序中,数据不能以字母开头,如要写成mov ax,0ffa3H。在debug下可直接用[0]表偏移为0,但在masm的汇编源程序中,此值表示数字0,有时可经bx再[bx]传入或直接指明段地址所在的段寄存器,如mov al,ds:[0]。附加段寄存器ES:存放当前执行程序中一个辅助数据段的段地址。

六、包含多个段的程序

定义段后,可用dw(define word)定义字型数据,且这些数据处于代码段的最开始位置。如前面设置个入口地址标志start,后面加end start则由end指定程序的开始位置是start,如果只用end则表示程序结束,可在前面定义数据,后面不规则指定开始标志。程序刚开始assume cs:code时系统会为其分配空间。将段用于栈可mov ax,cs mov ss,ax mov sp ,10H(指定顶)。

七、更灵活的定位内存地址的方法

and,or。db 'unIX',mov al,'a'。ASCII大小写差20H,即在第6位上大写为0,小写为1,可用and/or方式转换大小写。可用[bx+idata]方式指定内存单元或idata[bx](如0[bx],5[bx]此方式同C语言中的下标如a[i],b[i]),[bx].200等。SI、DI是8086CPU中和BX功能相近的寄存器,如设置SI为源位置,DI为目标位置进行复制操作,[bx+si]或[bx+di],也可写成[bx][si],[bx][di],[bx+si(di)+idata]或idata[bx][si]或[bx].200[si]或[bx][si].200,可认为idata是一个常量,而bx,si,di是变量。对于多层循环,可先把外层cx保存起来,内层循环退出后再恢复,可用栈的方式临时保存数据。

八、数据处理的两个基本问题

bx,bp,si,di可单独使用,但bx与bp不能同时使用,si与di不能同时使用。直接包含在机器指令中的数据(执行前在CPU的指令缓冲器中),在汇编语言中称为立即数(idata),bp类似sp段地址默认在ss中。寻址方式有:直接寻址,寄存器间接寻址,寄存器相对寻址,基址变址寻址(bx/bp+si/di),相对基址变址寻址。显示指明数据操作单位长度:X ptr其中X为word或byte,如mov word ptr ds:[0],1,inc是16位,但inc si只是增加1。div是除法,除数是8位时被除数为16位放在AX中,商在AL,余数在AH,除数是16位时被除数为32位,高位16位在DX,低16位在AX中,商在AX,余数在DX中。伪指令dd用来定义dword(double dword类型),伪指令dup用于数据重复,db(dw,dd) 次数 dup (重复的数据)。

九、转移指令的原理

操作符offset用来取标号的偏移地址,如offset start,结果是一个数字。jmp无条件,分段间、段内短转移(-128127)、段内近转移(-3276832767)。jmp short 标号,段内短转移,使用jmp 标号时,会被转成jmp 对应标号处指令的地址,然后其机器码可能为EB03看不到目标地址,其中03是跳转的偏移量,jmp short 标号的功能是(IP)=(IP)+8位位移(可能为负值),jmp near ptr 标号是16位,jmp far ptr 标号段间转移(远转移),如对应机器码为EA 0B 01 BD 0B其中高地址BD 0B是段地址,0B01是偏移地址。转移地址在内存中的格式为:jmp word ptr 地址(段内转移)或jmp dword ptr 地址(段间)(高地址字是段地址,CS=内存单元地址+2,IP=内存单元地址)。jcxz有条件转移(所有有条件转移指令都是短转移),当(cx)=0时转移不为0时不转移。loop所有的循环指令都是短转移。jmp short,jmp near ptr, jcxz,loop,在机器码中包含的是位移(由补码给出)而不是目的地址,此设计是为了程序段在内在中浮动装配。

十、CALL和RET指令

ret指令用栈中的数据,修改IP实现近转移,retf修改CS和IP实现远转移。call指令将当前IP或CS和IP压入栈中然后转移,且不能实现短转移,转移方式可是jmp near ptr 标号(16位偏移),或jmp far ptr 标号,或转移地址在寄存器中,如call ax,或转移地址在内存中如call word ptr 地址(只改IP)或call dword ptr 地址(改CS、IP)。mul只能是88位(一个默认在AL中,另一个在reg或内存中,结果在AX)或1616位(一个默认在AX中,另一个在reg或内存中,结果高位在DX,低位在AX)。

十一、标志寄存器

8086CPU中标志寄存器有16位,其中存储的信息通常被称为程序状态字(PSW),有ZF(零),PF(奇偶),SF(符号),CF(进位),OF(溢出)(CF是对无符号数运算有意义的标志位,而OF是对有符号数运算有意义的标志位,两者是独立的,用哪种只与数是否有符号有关)。利用adc可对任意大的数据进行加法,对于连续两个inc si,inc不会改变cf标志,add可能会修改cf,前面的adc需要加上cf,所有有时不能用add 2来代替inc,sbb带借位减法。cmp比较指令,功能相当于减法只是不保存结果,执行后将对标志寄存器产生影响,如cmp ax,ax不改变ax的值,但zf,pf=1,sf,cf,of=0。常用无符号转移指令:je,jne,jb,jnb,ja,jna。DF方向标志位,为0每次si、di递增,为1递减,串传指令:movsb将ds:si指向的内存单元中的字节送入es:di中,再根据df将si和di递增或递减,也有movsw,配合rep使用如rep movsb,movsw,根据cx值确定次数。cld命令是设置df=0。pushf将标志寄存器的值压栈,popf反之。在debug中,of对应OV,NV,sf对NG,PL,zf对ZR,NZ等。

十二、内中断

内中断可有除法错误(中断类型码为0),单步执行(1),执行into指令(4),int(指定),中断类型码的作用就是用来定位中断处理程序。iret指令的作用是弹出IP、CS,及popf。

十三、int指令

int 10h显示到屏幕。

十四、端口

对端口的读写用in,out。移位指令:shl,shr,移动次数放在cl中。BCD码是以4位二进制数表示十进制数码的编码方法。

十五、外中断

如键盘int 9。

十六、直接定址表

十七、使用BIOS进行键盘输入和磁盘读写

链接:https://pan.baidu.com/s/1IwWYAS_rlEib0cZIhamFaA 密码:mnii

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,376评论 6 491
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,126评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,966评论 0 347
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,432评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,519评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,792评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,933评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,701评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,143评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,488评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,626评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,292评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,896评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,742评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,977评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,324评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,494评论 2 348

推荐阅读更多精彩内容

  • 8086汇编 本笔记是笔者观看小甲鱼老师(鱼C论坛)《零基础入门学习汇编语言》系列视频的笔记,在此感谢他和像他一样...
    Gibbs基阅读 37,138评论 8 114
  • 计算机通过执行指令序列来使机器得以工作,所以对于每一系列的计算机都有指定的一组指令集供计算机使用,这组指令...
    未来科技工作室阅读 7,948评论 1 10
  • 王爽汇编全书知识点大纲 第一章 基础知识 机器语言 汇编语言的产生 汇编语言的组成 存储器 cpu对存储器的读写 ...
    2c3ba901516f阅读 2,408评论 0 1
  • # 常见汇编代码 # 1. 编写程序:比较AX,BX,CX中带符号数的大小,将最大的数放在AX中 code...
    喝豆腐脑加糖阅读 2,597评论 0 0
  • 路远情如旧,笺频爱更期。 性格才貌互心仪。 遥望数年甜蜜,相见不相惜。 北俊千花放,南矫百雪积。 冗杂零碎惹分歧。...
    忘了宠爱阅读 388评论 0 2