一 START END
开头有个START
结尾有个END
1.汇编语言中的start有什么用?
start就是一个标号,标志程序的入口而已,程序加载到内存之后CS:IP会指向这个标号,从START指向的指令开始运行
这个标号不一定是START,你也可以用MAIN,但在程序的最后要用END MAIN来提示程序结束
START也不一定在代码段的最前面,它的前面是可以有指令或数据的
例子(没有用start,用了main)(在代码段里放置变量是十分不规范的,这里只是为了举例):
assume cs:code
code segment
a db 0
b db 0
main:
mov ax,0
mov ax,4C00H
int 21H
code ends
end main
当然,start和main在汇编代码中也可以同时存在,看具体的需要而定。
2.汇编语言中START和MAIN有区别么?
没有区别,都是标号。叫什么都行
start: 作为汇编程序的一个标号,定义了程序的入口,既程序从start:处开始执行。
若程序的第一条指令就是程序的入口,则start可以缺省。
start 使用结构如下:
start: \可以定义程序的入口 ,也可以仅仅作为一个标号来用
…
end start \定义程序段结束 (作为标号时,可以没有对应的end start)
其中 start 可以用其他字符代替,但是对应的end start 中的start也必须用同字符代替。
若第一个start缺省,则end start中的 start 也必须去掉。
········································································································
最后到底是end start还是end main,要看程序中的汇编指令倒底是从哪儿开始执行的,一般看assume伪指令下面的一行的main:还是start:就可以。
二 例题
2.1 求出首地址为 DATA 的 100D 字数组中的最小偶数
;15、试编写一个汇编语言程序,求出首地址为 DATA 的 100D 字数组中的最小偶数,并把它存放在 AX 中。
.model small
.data
data dw 10,9,8,7,6,5,4,3,2,1,90 dup(60)
.code
start:
mov ax,@data
mov ds,ax
call mineven
mov ah,4ch
int 21h
mineven proc
push bx
push cx
push dx
push si
mov bx,offset data
mov si,0
mov cx,100
mov ax,[bx][si]
checker:
mov dx,[bx][si]
test dx,1b
jnz continue;check if even
cmp ax,dx
jle continue
mov ax,dx
continue:
add si,2
loop checker
pop si
pop dx
pop cx
pop bx
ret
mineven endp
end start
2.2 汇编统计非数字字符
;19、从键盘输入一系列以 $ 为结束符的字符串,然后对其中的非数字字符计数,并显示出计数结果。
.model small
.data
strings db '1234fdsa56fdsafdsa7fdsa890$'
.code
start:
mov ax,@data
mov ds,ax
call counter
mov ah,4ch
int 21h
counter proc
push ax
push bx
push dx
push si
mov bx,offset strings
mov si,0
mov ax,0
startcount:
mov dl,[bx][si]
cmp dl, '0'
jl nextloop
cmp dl,'9'
jg nextloop
inc ax
nextloop:
cmp dl,'$'
je display
inc si
jmp startcount
display:
mov dx,10
div dl
add al,'0'
add ah,'0'
push ax
mov dl,al
mov ah,02h
int 21h
pop ax
mov dl,ah
mov ah,02h
int 21h
pop si
pop dx
pop bx
pop ax
ret
counter endp
end start