代码改变世界

随笔分类 -  Assemble汇编

汇编语言:call和ret指令

2012-07-05 21:28 by youxin, 850 阅读, 收藏, 编辑
摘要: call和ret指令call和ret指令都是转移指令,它们都修改IP,或同时修改CS和IP。它们经常被共同用来实现子程序的设计。ret和retfret指令用栈中的数据,修改IP的内容,从而实现近转移;retf指令用栈中的数据,修改CS和IP的内容,从而实现远转移。CPU执行ret指令时,进行下面的两步操作:(1)(IP) = ((ss)*16 +(sp))(2)(sp) = (sp)+2CPU执行retf指令时,进行下面四步操作:(1)(IP) = ((ss)*16) + (sp)(2)(sp) = (sp) + 2(3)(CS) = ((ss)*16) + (sp)(4)(sp) = (sp 阅读全文

王爽实验8 分析一个奇怪的程序

2012-07-05 17:15 by youxin, 524 阅读, 收藏, 编辑
摘要: 题目:分析下面的程序,在运行前思考:这个程序可以正确返回吗?运行后再思考:为什么是这种结果?通过这个程序加深对相关内容的理解。assume cs:codesg codesg segment mov ax,4c00H int 21H start: mov ax,0 s: nop nop mov di,offset s mov si,offset s2 ... 阅读全文

汇编 一道小题

2012-07-05 15:44 by youxin, 238 阅读, 收藏, 编辑
摘要: 对于如下定义的段:name segment...name ends如果短中的数据占N个字节,则程序加载后,该段实际占有的空间为:______。(N/16+1)*16 [说明:N/16只取整数部分];为什么?一、这首先要从8086处理器寻址原理说起。8086这种处理器有二十根地址线(20个用于寻址的管脚),可以使用的外部存储器空间可达1MB(00000H~FFFFFH)。但是,8086内部的寄存器都是16位的,用任何一个寄存器(比如BX或SI),都无法直接寻址8086所支持的1M地址空间,因为16位寄存器只能表示640KB的空间范围(0000~FFFFH)。所以,Intel想了一个方法,设计出了 阅读全文

汇编:将以0结尾的字符串转换为大写并输出

2012-06-18 16:03 by youxin, 697 阅读, 收藏, 编辑
摘要: 编程:将'welcome-to-masm! 转成大写并输出。要注意判断是否为小写字母,不为字母(-)就不要转换了。assume cs:codedata segment db 'welcome-to-masm!',0 data endscode segmentstart: mov ax,data mov ds,ax mov si,0 ;ds:si 指向字符串 call captital mov dh,12 mov dl,0 mov cl,2 call show_str mov ax,4... 阅读全文

汇编语言中的英文

2012-06-06 18:40 by youxin, 952 阅读, 收藏, 编辑
摘要: AH&AL=AX(accumulator):累加寄存器 BH&BL=BX(base):基址寄存器 CH&CL=CX(count):计数寄存器 DH&DL=DX(data):数据寄存器 SP(Stack Pointer):堆栈指针寄存器 BP(Base Pointer):基址指针寄存器 SI(Source Index):源变址寄存器 DI(Destination Index):目的变址寄存器 IP(Instruction Pointer):指令指针寄存器 CS(Code Segment)代码段寄存器 DS(Data Segment):数据段寄存器 SS(Stack 阅读全文

编程:用7ch中断例程完成jmp near ptr s指令的功能,用bx向中断例程传送转移位移。

2012-06-03 21:59 by youxin, 644 阅读, 收藏, 编辑
摘要: 编程:用7ch中断例程完成jmp near ptr s指令的功能,用bx向中断例程传送转移位移。应用举例:在屏幕的第12行显示data段中,以0结尾的字符串。assume cs:codedata segment db 'conversation',0data endscode segmentstart: mov ax,cs mov ds,ax mov si,offset nr mov ax,0 mov es,ax mov di,200h mov cx,offset nrend-off... 阅读全文

编程:将a段和b段中的数据依次相加,保存在c段

2012-06-02 21:06 by youxin, 2120 阅读, 收藏, 编辑
摘要: 编程:编写code段中的代码,将a段和b段中的数据依次相加,保存在c段。assume cs:codea segment db 1,2,3,4,5,6,7,8a endsb segment db 1,2,3,4,5,6,7,8b endsc segment db 0,0,0,0,0,0,0,0c endscode segmentstart: ?code endsend start程序如下:;将a段和b段的数据依次相加,将结果存入到c段中assume cs:codea segment db 1,2,3,4,5,6,7,8a endsb segment db 1,2,3,4... 阅读全文

编写0号中断的处理程序

2012-06-02 19:57 by youxin, 630 阅读, 收藏, 编辑
摘要: 实验12 编写0号中断的处理程序 编写0号中断的处理程序,使得在除法溢出发生时,在屏幕中间显示字符串“divide error!”,然后返回到DOS。assume cs:codecode segmentstart:mov ax,csmov ds,axmov si,offset domov ax,0mov es,axmov di,200hmov cx,offset doend-offset do ;存放中断处理程序 cldrep movsbmov word ptr es:[0],200hmov word ptr es:[2],0 ;设置中断向量表mov dx,0ff... 阅读全文

汇编将数据以十进制格式显示在屏幕上

2012-06-01 15:26 by youxin, 2732 阅读, 收藏, 编辑
摘要: 子程序描述名称:dtoc功能:将word型数据转变为表示十进制数的字符串参数:(ax)=word型数据 ds:si指向字符串的首地址应用举例:将数据12666以十进制形式在屏幕的8行3列,用绿色显示出来。分析: 要得到字符串“12666”,就是要得到一列表示该字符的ascii吗,31h,32h,36h,36h,36h.十进制数码字符对应的ascii=十进制数码值+30h看我最开始写的一段代码,是有问题的,不能逆序输出,输出的是66621dtoc: push ax push bx push cx push dx push si ... 阅读全文

DF标志和串传送指令

2012-06-01 13:31 by youxin, 2076 阅读, 收藏, 编辑
摘要: flag标志的第10为为DF(direction flag)(方向标志位,在串传送指令中,控制每次操作后si,di的增减。df=0 每次操作后si,di递增df=1 递减串传送指令1:传送一个字节(8位)格式:movsb功能:将ds:si指向的内存单元中的字节送入到es:di中,然后根据标志寄存器DF位的值将si和di递减或递增。分析,movsb指令相关于进行下面的几步操作:1) ((es)*16 +(di)) =((ds)*16 +(si)) 2) 如果DF =0,则:(si) =(si) +1 (di) =(di) +1 如果DF =1,则:(si) =(si) -1 ... 阅读全文

转:汇编寄存器的使用

2012-05-30 12:21 by youxin, 585 阅读, 收藏, 编辑
摘要: 一、汇编语言中,为什么SI和DI不能同时使用汇编其实你可以想一下,这两个寄存器的意思,SI源变址寄存器,DI目地变址寄存器,既然是变址寄存器,那么他们肯定是在某个地址的基础上进行偏移变化,由此我们就得出了需要基址寄存器。你要是把这两个寄存器同时使用,那你地址变化的基址都没有,你该怎么变化呢?你在谁的基础上变化(也就是地址偏移)?对于这些汇编中的规定,其实有时并不需要书上详细的介绍,我们都应该可以从中推导出这些规则,书上的那些介绍个人认为只是用来验证我们的推测的。或是对我们所掌握的知识的进行检测,用来说明我们所掌握的是对的!1:数据寄存器,一般称之为通用寄存器组 8086 有8个8位数据寄存器, 阅读全文

汇编语言之寄存器使用bx si di bp

2012-05-29 22:35 by youxin, 1121 阅读, 收藏, 编辑
摘要: 这里对这几个寄存器总结一下。通用寄存器的主要用途寄存器的分类寄存器主 要 用 途通用寄存器数据 寄存器AX乘、除运算,字的输入输出,中间结果的缓存AL字节的乘、除运算,字节的输入输出,十进制算术运算AH字节的乘、除运算,存放中断的功能号BX存储器指针CX串操作、循环控制的计数器CL移位操作的计数器DX字的乘、除运算,间接的输入输出变址寄存器SI存储器指针、串指令中的源操作数指针DI存储器指针、串指令中的目的操作数指针变址寄存器BP存储器指针、存取堆栈的指针SP堆栈的栈顶指针指令指针IP/EIP标志位寄存器Flag/EFlag32位CPU的段寄存器16位CPU的段寄存器ES附加段寄存器CS代码段 阅读全文

编写不会产生除法溢出的子程序

2012-05-29 22:20 by youxin, 316 阅读, 收藏, 编辑
摘要: divdw: 不溢出除法,被除数为dword,除数为word,结果为dword;参数:(dx):(ax)=被除数高、低16位(cx)=除数;返回:(dx):(ax)=结果的高、低16位(cx)=余数h,L表示被除数H的高16位和低16位,int(h/n)取商,rem(h/n)取余。n代表除数.采用公式:x/n=int(h/n)*65536+[rem(h/n)*65536+L]/n即:int(h/n)作高16位, rem(h/n)做被除数高16位,L做低16位,除以n 的结果做 低16位。最开始相当很复杂,答案很简单:assume cs:codecode segmentst... 阅读全文

汇编语言注释标记符

2012-05-29 21:40 by youxin, 5076 阅读, 收藏, 编辑
摘要: 最常用的单行注释符号;分号 多行注释:可以用 comment 语句来成块注释掉的: comment /* 1 2 content 3 .... */Masm 的语法是 comment 语句后的首个非空格字符起到下一个该字符止均为注释内容. 上面就是用 '/ ' 字符来作为注释分隔符的. 以 /* .... */ 的形式出现, 只是为了和 c 类似。可以用别的。 阅读全文

编写在显存中显示字符串的子程序

2012-05-29 20:58 by youxin, 424 阅读, 收藏, 编辑
摘要: 第十章 实验十 练习1; 子程序描述; 名称:show_str; 功能:指定位置,用指定颜色,显示一个用0结束的字符串; 参数:(dh) = 行号(0--24),(dl) = 列号(0--79);(cl) = 颜色,ds:si 指向字符串的首地址; 返回:无assume cs:code, ds:datadata segment db 'Welcome to masm', 0data endscode segmentstart: mov ax, data mov ds, ax mov dh, 8 mov dl, 3 mov cl, 2 mov si, 0 call show_st 阅读全文

masm mov指令不支持 内存到内存的转移

2012-05-29 20:46 by youxin, 729 阅读, 收藏, 编辑
摘要: mov byte ptr es:[bx+di],ds:[bx+si]编译报错,原因是mov指令规定。两个操作数不能都是存储器–------传送指令很灵活,但主存之间的直接传送却不允许• 8086指令系统不允许两个操作数都是存储单元(除串操作指令),要实现这种传送,可通过寄存器间接实现mov ax , buffer1;ax←buffer1(将buffer1内容送ax)mov buffer2 , ax;buffer2←ax;这里buffer1和buffer2是两个字变量、;实际表示直接寻址方式段寄存器的操作有一些限制 –----段寄存器属专用寄存器,对他们的操作能力有限• 不允许立即数传送给段寄. 阅读全文

转:cmd和command的区别

2012-05-28 18:08 by youxin, 1361 阅读, 收藏, 编辑
摘要: cmd:命令提示符(命令提示行),Cmd则是win2000或更高版的系统中新增的功能,表面看来是一样,但cmd比command功能要强大得多CMD 命令提示符可以当作是 Windows 的一个附件, Ping,Convert 这些不能在图形环境下使用的功能 要借助它来完成。command::DOS命令解释器(command 是精简dos. )。Command 调用的则是系统内置的 NTVDM,一个 DOS 虚拟机。它完全是一个类似 Virtual PC 的虚拟环境,和系统本身联系不大。cmd和command最明显的区别:cmd支持中文,而command只能支持8.3规则。注:8.3规则:8.3 阅读全文

汇编语言debug常用调试 命令详解

2012-05-28 13:33 by youxin, 4770 阅读, 收藏, 编辑
摘要: 显示修改寄存器命令RR;★显示所有寄存器和标志位状态;★显示当前CS:IP指向的指令。显示标志时使用的符号:标志 标志=1 标志=0OF OV NVDF DN UPIF EI DISF NG PLZF ZR NZAF AC NAPF PE POCF CY NC显示命令D① D [地址]② D [范围]如不指定范围,一次显示8行×16个字节。-D ;默认段寄存器为DS,当前偏移地址-D DS:100 / -D CS:200-D 200:100-D 200;200为偏移地址,默认段寄存器DS-D DS:100 110/ -D 100 L 10修改命令E① E 地址 ;从指定地址开始,修改 阅读全文

汇编程序运行的过程

2012-05-28 13:23 by youxin, 933 阅读, 收藏, 编辑
摘要: DOS中有一个程序command.com,这个程序在DOS中称为命令解释器,也就是DOS系统的shell. DOS启动时,先完成其他重要的初始化工作,然后运行command.com,command,com运行后,执行其他相关任务后,在屏幕上显示出由当前盘符和当前路径级成的提示符。用户可以输入所要执行的命令。这些命令由command执行,command执行完这些命令后,再次显示提示符,等用户的输入。 如果用户想执行一个程序时,则输入该程序的可执行文件的名称,command首先根据文件名找到可执行文件,然后将这个可执行文件中和程序加载入内存,设置CS:IP指向程序的入口。此后,command... 阅读全文

汇编操作显存

2012-05-21 22:50 by youxin, 3076 阅读, 收藏, 编辑
摘要: 80*25彩色字符模式显示缓冲区(以下简称显示缓冲区)的结构: 内存地址中,b8000h-bffffh共32kb空间,为80*25彩色字符模式的显示缓冲区。向这个地址空间写入数据,写入的内容会立即出现在显示器上。 在80*25模式下,显示器可以显示25行,每行显示80个字符,每个字符有256中属性(背景色,前景色等)。这样,一个字符在显示缓冲区就要占2个字节,分别存字符的ascii码和属性。在80*25下,一屏的内容在显示缓冲区中共占4000个字节。显示缓冲区分为8页,每页4kb(约等于4000b),显示器可以显示任意一页的内容。一般情况下,显示第0页的内容,也就是说通常情况下,b8000.. 阅读全文
点击右上角即可分享
微信分享提示