汇编语言里面关于 push mov lea的一点小问题。

汇编语言里面关于 push mov lea的一点小问题。,第1张

push 的后面,应该写16位的 *** 作数,可以是寄存器名称,如:

push AX

push BX

……

-------

mov eax,[xxx],是把逗号右边,当做源,左边当做目的。

80x86 的汇编,都是这样的。

其它的汇编语言,也有用左边的当做源。

LEA

DX,S

就是把变量s的地址(也就是字符串开始的地址)放到ds:dx中ds是段地址,dx是偏移。

MOV

AH,9

是指出调用是dos的9号功能,这个功能是显示一个以$结尾的字符串,$的ascii码是24h。

INT

21H

是调用dos中断。dos *** 作系统提供的功能大部分都放在int

21h中,你可以认为int

21h是你写的程序和dos内核的接口。

首先LEA SI,S9和LEA DI,S9+1就是将S9的偏移地址存到SI中,S9+1的偏移地址存到DI中,此时(SI) = 0,(DI) = 1;CX是计数器,初值是5,表示循环5次。

接着到循环体LOP:将SI寄存器中的值也就是0赋给AL,交换AL和DI寄存器里面的值(也就是1),再将AL中的值(交换后AL存1,DI存0)赋给SI,然后SI的地址+2(本来是S9,现在是S9+2也就是值2的地址),DI的地址加2(同SI),接着就循环下去,最后出循环。(其实看这一段就知道是将数组S9的值每两个交换一次)

最终结果应该是1,0,3,2,5,4,7,6,9,8

你这个代码还有点问题,帮你改了,黑子部分是添加的代码,否则无法看到结果:

data

segment

str

db

0ah,0dh

num

db

4

dup(),'H$'

tab

db

'0123456789ABCDEF'

data

ends

code

segment

assume

cs:code,ds:data

begin:

mov

ax,data

mov

ds,ax

xor

bx,bx

mov

cx,10

next:

mov

ah,1

;1号功能从键盘读入字符

int

21h

cmp

al,0dh

;如果=13也就是回车则跳到conv进行转换

jz

conv

push

ax

;暂存ax

mov

ax,bx

;bx存当前已有的数值,这里叫唤是为了用mul

mul

cx

;bx=bx10

mov

bx,ax

;以下2句还原状态

pop

ax

and

al,0fh

;这是把'1'转换成1的动作

xor

ah,ah

;清空高位

add

bx,ax

;相加

jmp

next

;继续读取下个字符

;这一段程序用伪代码描述大概是

;cx

=

10

;bx

=

0

;next:

;ah

=

读入字符

;if

ah

=

回车

goto

conv

;bx

=

bxcx

+

ah-'0'

;goto

next

;conv:

conv:

mov

ax,bx

;bx里存的是输入的10进制数

mov

ch,4

lea

bx,tab

;bx保存16进制字符表的基址

mov

cl,4

lea

si,num

;num是转换后存16进制字符的地方

lopa:

rol

ax,cl

;ax左移动4位,由于是rol,所以高4位移到低4位

push

ax

;暂存

and

ax,000fh

;取出低4位,也就是高4位移过来位

mov

di,

ax

;查表

mov

al,

[bx+di]

mov

[si],al

;存储

inc

si

;下个位置

pop

ax

;还原状态

dec

ch

;ch=ch-1

jnz

lopa

;if

ch

!=

0

goto

lopa

;这一段的工作原理是分别取出ax的每个4位二进制元组(也就对应了一位16进制数)

;然后利用bx查表,把查到的字符存入num

;比如ax

=

1111

1010

0010

1000

;那么循环4次分别得到1111B=Fh,1010B=Ah,0010B=2h,1000=8h

;所以最后num里存的也就是FA28H了

;rol

ax,

cl(=4)是把ax的高4位,比如这里的1111,旋转到低4位

;所以第一次rol

ax,

cl后便得到1010

0010

1000

1111

lea

dx,str

;输出

mov

ah,9

int

21h

mov

ah,4ch

int

21h

code

ends

end

begin

xor 异或 对于二进制0和1而言,相异为一,相同为0。如 1 xor 0= 1,1 xor 1 =0

shr,shift logical right(逻辑右移),用于汇编语言中,属于逻辑运算中的移位指令

rep ,只有ret,rep我没见过,RET是子程序的返回指令,用于子程序的最后。

lea,lea AX,XXX 取标号XXX的偏移地址给AX

cmp A,B 比较A,B大小, *** 作是A-B,在这一局后面接jl等条件跳转指令

jl 见cmp,如果相等则跳转

test A,B 作A与B的 *** 作

如果这些看不懂,建议你找一本汇编书好好看看,重点看寄存器,指令,寻址方式等,看了还要记住。适当做点练习,汇编很痛苦,但是当你把寄存器和指令还有寻址方式记熟了,相信汇编对你就是快乐的。

实际上,楼主是知道这两条指令的差别的,只是觉得用lea指令有些多此一举。事实不然。

当源 *** 作数很简单的情况下,完全可以用mov指令代替lea指令,如lea esi,Buffer,完全可以用指令mov esi,offset Buffer代替;但当源 *** 作数稍微复杂一点的话,单用mov指令就代替不了了,至少要用到算术运算指令。指令集中提供lea指令,就是为了减少这些计算上的麻烦。

制造出来的设备、工具是为了减轻人们的劳动强度和提高工作效率。犹如,用原始的铁锅、烧柴禾能够烧菜、做饭,用煤气灶、电饭锅也能烧菜、做饭,你愿意用哪个呢?

以上就是关于汇编语言里面关于 push mov lea的一点小问题。全部的内容,包括:汇编语言里面关于 push mov lea的一点小问题。、汇编语言中 LEA DX,S MOV AH,9 INT 21H具体意思是什么,请大师指教。、DATA SEGMENT S9 DB0,1,2,3,4,5,6,7,8,9 DATA ENDS ┇ LEA SI,S9 LEA,DI,S9+1 MOV CX,5 LOP:等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: http://outofmemory.cn/zz/9732669.html

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

发表评论

登录后才能评论

评论列表(0条)

保存