汇编学习(五)8086汇编拾遗 (4)
汇编模块化成程序语言设计
使用寄存器来存储参数和结果是最常用使用的方法。对于存放参数的寄存器和存放结果的寄存器,调用者和子程序的读写操作恰恰相反,调用者将参数送入寄存器,从结果寄存器中取到返回值;子程序从参数寄存器中取到参数,将返回值送入结果寄存器中。
上边这段话,看起来像是很冗余,但是却贯穿汇编语言始终8086,X86都是如此。
一个转换大小写的程序
assume cs:code data segment db 'helloworld' data ends code segment start: mov ax,data mov ds,ax mov si,0 mov cx,10 call capt mov ax,4c00h int 21h capt: and byte ptr [si] ,11011111b inc si loop capt ret code ends end start
以上,将hello world 转换成大写。 一个使用函数显示字符串的例子实验10练习题,自己写的,不是太好。
assume cs:code
data segment
db 'welcome to masm!',0
data ends
code segment
start:
mov ax,data
mov ds,ax ;set data
mov si,0
mov dh,8
mov dl,3
mov cl,2
call show_ptr
mov ax,4c00h
int 21h
show_ptr:
push ax
push bx
push es
push si
push cx
mov ax,0b800h
mov es,ax ;set es view segment
mov ax,160
mul dh
mov bl,dl
mov bh,0
add ax,bx
add ax,bx
mov di,ax
mov ah,cl
mov si,0
x:
mov cl,ds:[si]
mov ch,0
jcxz ok
mov al,cl
mov es:[di],ax
inc si
inc di
inc di
jmp x
ok :
pop cx
pop si
pop es
pop bx
pop ax
ret
code ends
end start
打印数字1266
assume cs:code
data segment
db 10 dup(0)
data ends
code segment
start:
mov ax,12666
mov bx,data
mov ds,bx
mov si,0
call dtoc
mov dh,8
mov dl,3
mov cl,2
call show_ptr
mov ax,4c00h
int 21h
dtoc:
push ax
push bx
push cx
push dx
push si
mov bx,0
x:
mov dx,0
mov cx,10
div cx
mov cx,ax
add dx,'0'
push dx
inc bx
jcxz z
jmp x
z:
mov cx,bx
x1:
pop ds:[si]
inc si
loop x1
pop si
pop dx
pop cx
pop bx
pop ax
ret
show_ptr:
push ax
push cx
push dx
push es
push si
push di
mov ax,0b800h
mov es,ax
dec dh
mov al,160
mul dh
add dl,dl
mov dh,0
add ax,dx
mov di,ax
mov ah,cl
x2:
mov cl,ds:[si]
mov ch,0
jcxz F
mov al,cl
mov es:[di],ax
inc si
inc di
inc di
jmp x2
F:
pop di
pop si
pop es
pop dx
pop cx
pop ax
ret
code ends
end start
还没有评论,来说两句吧...