汇编学习笔记
azraelxuemo
这个作者很懒,什么都没留下…
展开
-
汇编学习第七周
rep movsb;可以复制内存块,具体采用哪个方案取决于df的状态,df=0,则代表字符串赋值按照正方向,如果df=1,表示字符串赋值按照反方向,相应的代码就变了等价于again: byte ptr es:[di]=byte ptr ds:[si] si++ di++;这就是正方向 cx-- if(cx!=0) goto agian; 把ds:si指向的内存赋值给es:di如果反方向的话si--;di--;strcpy(target,source);永远按照正方向复制strn原创 2021-06-22 14:25:35 · 105 阅读 · 0 评论 -
可执行程序的两种格式
exe格式com格式编写com格式的汇编程序必须遵守以下规则(1)程序中一般只定义一个代码段,没有数据段和堆栈段(2)程序中不能含有引用段名或者段地址的语句(3)程序入口的偏移地址必须等于100h,也就是说,在源程序最后由end指定的那个表示程序入口的标号的偏移地址必须说100hcode segmentassume cs :code,ds:code org 100hmain: jmp beginhi db 'It is a com program',0Dh,0Ah,'$'begin:原创 2021-06-22 14:24:58 · 339 阅读 · 0 评论 -
MS-DOS,PC-BIOS调用
BIOS或DOS调用可按以下五步进行(1)功能号装入AH(2)参数装入其他寄存器(3)int n调用中断(4)检查返回值BIOS更靠近硬件,处理速度更快DOS调用输入字符功能(AH=01h/int 21h)键盘单个字符输入的功能mov ah,01hint 21h;保存在al中;ex:从键盘输入一个字符并保存到变量char中data segmentchar db '?'data endsstack1 segment stackdw 100h dup(?)st原创 2021-06-22 14:00:28 · 196 阅读 · 0 评论 -
内存分配与文件操作
MS-DOS中,用户程序课访问从地址00000h开始到0FFFFFh结束的1MB内存从00000h到09ffffh结束的前640k内存称为常规内存区从0A000h到0fffffh结束的384k是rom硬件驱动程序,视频刷新缓冲区而前640k可分为操作系统区域和临时程序区域重新分配内存空余内存指针4AH;重新分配内存;AH=4Ah;ES=已分配的内存块段地址;BX=要求分配的内存节数(1节=16字节);cf=0成功;cf=1错误;bx=该内存块最大内存节数;ax=错误原创 2021-06-22 08:34:34 · 156 阅读 · 0 评论 -
汇编学习笔记(14)--控制转移指令
无条件跳转指令jmpjmp dest;短跳;ip=dest;jmp idata;jmp short idata;短跳的目标地址idata与该指令的下条指令的偏移地址之间的距离必须在[-128,127]之内;短跳指令编译成机器码后,前面一个字节为EBh表示短跳,后一个字节为1个8位符号数表示目标地址与下条指令偏移地址之差jmp dest;近跳ip=dest;jmp idata jmp reg jmp mem;指令编码位3个字节,第一字节位E9h,第二与第三字节构成一个16位符号数表示目标地原创 2021-05-20 09:19:26 · 269 阅读 · 0 评论 -
汇编学习笔记(13)--字符串操作
字符串操作指令包括: movs 字符串传送 cmps 字符串比较 scas 字符串扫描 stos 存入字符串 lods 从字符串取指令前缀 rep 重复 repe 相等则重复 repz 结果为0则重复,与repe等价 repne 不相等则重复 repnz 结果不为0则重复,与repne完全等价单独的字符串指令表示执行一次字符串操作,加了指令前缀的字符串指令表示重复执行字符串操作字符串传送指令 movsb movsw movs[rep] movsb;以原创 2021-05-20 08:57:12 · 1474 阅读 · 0 评论 -
汇编学习笔记(12)--循环程序设计
循环程序的控制方法计数法正计数法和到计数法,原理一样,但由于倒计数法有loop指令,用的比较多ex:从键盘上读入1个1位十进制数,显示其对应的4位二进制数data segmentMsg1 db 'input a num(1-10):$'ErrMsg db 0Dh,0Ah,'invalid input$'data endscode segmentassume cs:code,ds:datamain: mov ax,data mov ds,ax mov dx,offset Msg原创 2021-05-17 17:04:33 · 456 阅读 · 0 评论 -
汇编学习笔记(11)--分支程序设计
单分支程序设计对2个8位非符号数,按递减次序重新排序data segmentnum db 12h,65hdata endscode segmentassume cs:code,ds:datamain: mov ax,data mov ds,ax mov al,num cmp al,num[1] jae Done;因为使比较非符号数,所以使用jae(大于等于) mov dl,num[1];如果num<num[1],那么需要交换次序 mov num[1],al mov原创 2021-05-17 11:07:05 · 526 阅读 · 0 评论 -
汇编学习笔记(10)--顺序程序设计
设x是一个8位非符号数,且5<=x<=250,求y=x^2+8*x-30,不会超过字的范围,所以将结果保存为字即可data segmentx db 10y dw ?data endscode segmentassume cs:code,ds:data,ss:stkmain: mov ax,data mov ds,ax mov al,x mul al;求x*x,此时结果保存在ax中 mov cx,ax mov bl,x mov al,8 mul bl;求8*x,此时原创 2021-05-17 10:15:46 · 285 阅读 · 0 评论 -
汇编学习笔记(9)--算术指令
xchg op1,op2;交换指令操作:temp=op1 op1=op2 op2=temp格式:xchg reg,regxchg reg,memxchg mem,regxchg不影响任何标志位,xchg的操作数中不可以有段寄存器in acc,port ;从端口读数据到al或ax中操作: acc=[port];[port]表示地址为port的端口中的内容格式: in acc,idata;idata是立即数,并且00h<idata《=0ffh,acc为al或ax in acc,dx;原创 2021-05-17 09:48:32 · 374 阅读 · 0 评论 -
汇编学习笔记(8)--杂类指令
clc;清进位位cf=0stccf=1cmccf=~cfcld;清方向位 df=0stddf=1cli;禁止中断;用来禁止外部中断如时钟中断if=0sti;允许中断if=1nop;无操作;对应的机器码是90hhlt;停止处理器;将停止处理器的工作,直到系统复位或者发生非屏蔽中断或外部中断...原创 2021-05-16 19:04:13 · 156 阅读 · 0 评论 -
汇编学习笔记(7)--逻辑运算和移位
逻辑运算指令 and or xor not testand dest,src;二进制与运算;dest=dest & src of=0 cf=0or dest,src;dest=dest|src of=0 cf=0xor dest,src;dest=dest^src of=0 cf=0,异或,相同为0,不一样为1not op;op=~optest dest,src;null=dest &src;test类似于and指令,但结果不影响dest,仅影响标志位mov al,9原创 2021-05-16 18:15:26 · 423 阅读 · 0 评论 -
汇编学习笔记(6)--汇编程序格式
段的定义,假设与引用段的定义格式segment_name segment [align] [combine] ['class'] statementssegment_name ends;关键字segment表示段定义的开始,关键字ends表示段定义的结束(end of segment),segment_name表示段名,任何一个段都必须有段名,statements表示汇编语言的语句;align表示对齐方式,它是以下5个关键字的其中一个:byte word dword para..原创 2021-04-22 09:50:01 · 1171 阅读 · 0 评论 -
汇编学习笔记(5)-8086/8066架构
8086/8088CPU功能结构20根地址总线,可直接寻址的内存为1MB,2^20B,8088的数据总线有8根,8086的数据总线有16根,但字节均为16位执行单元EU由8个16位的通用寄存器,1个16位的标志寄存器,16位的算术逻辑单元,及EU控制电路组成EU的功能是执行指令。EU从指令队列取出指令代码,并在ALU中进行计算,运算结果的特征保存在标志寄存器FL中8086/8066的内部寄存器共有14个16位寄存器,可分为8个通用寄存器,4个段寄存器,2个控制寄存器通用寄存器..原创 2021-04-10 10:10:28 · 1021 阅读 · 0 评论 -
汇编学习笔记(4)
data segmenthz db 04h,80h,0eh,0A0h,78h,90h,08h,90hcode segmentmain: mov ax,data mov ds,ax mov check_next_dot: next_row: mov ah,hz[si] mov al,hz[si+1] jnc no_dot;若没有进位,即cf=0,则跳到no_dot,cf(进位),刚移出的位会自动进入CF(进位标志)code ends0000:0000原创 2021-04-09 10:39:29 · 409 阅读 · 1 评论 -
汇编学习笔记(3)
;把128k数据填入到1000:000的内存单元;solution;先填满1000:0~1000:ffffmov dx,2;因为要填充两个内存块,所以循环两次,mov ax,1000h;填充第一个10000hbyte内容,这时候的偏移地址是1000hmov ds,ax;过度给dsnexxtblock:;大循环 mov bx,0;保存offset mov cx,0;用作内循环次数的判定,因为要从0一直放到ffff相当于要循环10000h次,而cx只是一个16位寄存器,无法存放10000h,原创 2021-04-09 10:36:43 · 222 阅读 · 1 评论 -
汇编学习笔记(2)
db ;8 bit chardw;define word double byte short int 16bitdd define float or long int 32 bit dq;define quadruple word 8 byte 64 bit,double or int of 64bitdt;define ten bytes 80bit ;long double %LF can not use to define a int pi dd 3.14;define a float原创 2021-04-09 10:36:03 · 281 阅读 · 1 评论