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:等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)