汇编学习(四)8086汇编拾遗 (3)
jcxz 指令:条件指令,所有的转移都是短转移,IP 的修改范围是-128~127 之间。
eg. 查找内存2000H段中的一个值为0的字节,然后将它的偏移地址存储在dx 中。
assume cs:code code segment start: mov ax,2000H mov ds,ax mov bx,0 S:mov ch,0 mov cl,ds:[bx] jcxz OK inc bx jmp S OK: mov dx,bx mov ax,4c00h int 21h code ends end start
使用偏移量进行转移的意义: 方便程序段在内存中的浮动装配,也就是地址重定向的原理,链接过程的精髓,其实只是一个很简单的道理。 当编译器检测到位移超界后就会报错,这一点编译器可以做到。所以jmp 指令后的标号其实就是偏移量,带有符号位的偏移量。 关于一个绿色“hello world” 程序的小例子
assume cs:code ,ds:data
data segment
db 'hello world'
data ends
code segment
start:
mov ax,data
mov ds,ax
mov ax,0b800H
mov es,ax
mov si ,0
mov di ,10*160 + 80
mov cx,11
S1:mov al,ds:[si];
mov ah,00000010B
mov es:[di],ax
inc si
inc di
inc di
loop S1
mov ax,4c00h
int 21h
code ends
end start
这仅仅是一个小例子,我们接着学习。 ret 指令:从栈中弹出一个值,修改IP 内容 retf 指令: 从栈中先弹出一个值IP ;然后弹出一个值CS。 call 指令 : 将下一条指令压栈,转移 关于call 的几种用法: call 标号: 将下一条IP 压栈,然后转到标号处执行指令,call 也是一个转移偏移。 call far ptr 标号:实现的是段转移,实现过程,先压CS 再压IP进栈。跳转到标号去。 call reg : 直接跳转寄存器的值。 call word ptr: 内存单元地址 ,相当于直接使用内存中的值修改IP。 call dword ptr 内存单元地址,相当于先压CS 再压IP 。 一个简单的函数小例子来自《汇编语言》
assume cs:code
code segment
start: mov ax,1
mov cx,3
call s
mov bx,ax
mov ax,4c00h
int 21h
s:add ax, ax
loop s
ret
code ends
end start
自此我们就可以尝试设计带有子程序的程序了。 mul 乘法指令: 参数注意:要么都是8位,要么都是16位,如果是8位,一个默认在AL,另一个在8位reg 和 内存中,如果是16位,一个默认在AX 中,另一个在16位reg 或内存单元中。 结果:如果是8位年默认在AX 中,如果是16位,结果高位默认在DX ,低位在AX。
还没有评论,来说两句吧...