如何快速看懂汇编语言程序?

如何快速看懂汇编语言程序?,第1张

首先得了解汇编指令吧,其次得用机器的逻辑思考问题,明白其中的存储、累加、判断、转移等概念。

比如,1+2+....+100这样的问题,虽然我们可以给出公式计算,但机器并不知道,它只能知道,而且只能每次做一个加法,而且鉴于CPU的架构不能存所有的这些数值-如果这些数量不定的话更复杂,比如这些数是放在一个内存区域的,内存区域约定如下:第一个数表示总共有多少个数,后面是相应的数据,在这些数没有规律时是不能用公式的。

另外,许多CPU约定只有一个累加器(同时也是一个寄存器,假设它是寄存器AX),它允许从内存读一个数(MOV或者LD指令),只能进行内存数据加法(ADD [地址])。

于是我们只能这样,首先设置指针寄存器BX:

start: mov BX,#地址 设置内存区域起始地址,保存在BX中

mov CX,[BX]取出总数到CX中,假设CX可以做简单递增或递减

dec CX 预减一次计数器,因为加法只需做CX-1次

inc BX

mov AX, [BX]取出数据

loop: inc BX递增BX,使之指向真实数据

ADD AX,[BX]用下一数据进行累加,并将结果保存在AX中

dec CX假定这个减法会影响标志位ZF

JNZ loop 如果没有减到0就继续loop到这里之间的 *** 作

mov [BX], AX保存累加结果到数据区的尾部

HALT 停机

可以看出,上述代码并不能告诉我具体结果是多少,除非我们通过工具去访问这一内存区域,于是一个系统会设计出来专门让我们进行基本的输入输出,把计算机的内部情况甚至内存情况通过I/O口送出来,这些IO设备,比如键盘负责接收我们的机器指令(可以是汇编结果,也可以是高级语言产生的二进制指令和数据流),把结果输出到打印机或者CRT这样的输出设备上(通常映射为端口,IO PORT)。这就是BIOS完成的工作,如int 8负责时钟,int 10负责屏幕,int 16负责键盘等等。更进一步,可以进一步封装称DOS调用,如int 21负责基本的输入输出包括文件 *** 作等等。WINDOWS等 *** 作系统则通过驱动层进行多级抽象提供 *** 作界面给编程人员,编程人员再进一步封装出对话框或全屏文字菜单或流式(行式 *** 作) *** 作界面给最终用户。

data segment------定义一个段,段名data

l1 db 'abcde'-------定义字节型数据,标号l1

x1 db 'yes$'-------定义字节型数据,标号x1

x2 db 'no$'--------定义字节型数据,标号x2

data ends--------data段结束

data1 segment-------定义一个段,段名data1

l2 db 'abjde'------定义字节型数据,标号l2

data1 ends--------data1段结束

code segment----------定义一个段,段名code

assume cs:code,ds:data,es:data1-----------伪指令,假设code段与cs关连,假设data

与ds关连,假的data与es关连,这条指令只是给编译器看的,不会被编译成机器码

start:mov ax,data-------标号start,代表程序的入口地址。下面连续8条指令为repe cmpsb指令做铺垫,repe是重复执行字符串的指令,cmpsb是比较字符串的指令

mov ds,ax------用于字符串比较的第一个段地址

mov ax,data1

mov es,ax-------用于字符串比较的第二个段地址,因为比较的是两个地址处的字符串

mov cx,5--------设置cx值,用来计数repe重复次数

lea si,l1---------将l1标号地址传送给si,这个si是给ds的偏移

lea di,l2---------将l2标号地址传送给你di,这个di是给es的偏移

cld------将df标志位置0,这样repe cmpsb就可以正向执行

repe cmpsb---------上面的铺垫工作完成,就可以执行这个指令,开始多次重复比较字符

jne next---------如果取到的两个字符不相同,那么跳转到标号next处,如果相同,则继续往下执行

lea dx,x1-------将x1标号地址传给dx,这是21h中断例程的一个参数,21h中断例程的9号命令就是用来把ds:dx指向的字符串输出到屏幕上,现在ds中的值data,dx的值是x1的地址,那么ds:x1指向的是‘yes$’字符串的首地址

mov ah,9--------这是设置ah,用来指定下面21h中断例程用的哪个命令

int 21h-------调用21h中断例程

jmp exit----------跳转到标号exit处

next:lea dx,x2-------将x2标号处地址传给dx,跟上面lea dx,x1一样的功能

mov ah,9-------跟上面功能一样

int 21h---------跟上面功能一样

exit:mov ah,4ch---------这个应该知道的吧

int 21h-----------这个也应该知道

code ends---------code段结束

end start--------整个程序结束,指定start标号为程序入口。

总结:这个程序的意思就是比较l1和l2处两个字符串是否完全相同,如果完全相同就在屏幕输出yes字符串,不同则输出no字符串。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/10948525.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-12
下一篇 2023-05-12

发表评论

登录后才能评论

评论列表(0条)

保存