一 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
.datadata dw 10,9,8,7,6,5,4,3,2,1,90 dup(60)
.codestart:mov ax,@datamov ds,axcall minevenmov ah,4chint 21hmineven procpush bxpush cxpush dxpush simov bx,offset datamov si,0mov cx,100mov ax,[bx][si]checker:mov dx,[bx][si]test dx,1bjnz continue;check if evencmp ax,dxjle continuemov ax,dxcontinue:add si,2loop checkerpop sipop dxpop cxpop bxretmineven endp
end start
2.2 汇编统计非数字字符
;19、从键盘输入一系列以 $ 为结束符的字符串,然后对其中的非数字字符计数,并显示出计数结果。
.model small
.datastrings db '1234fdsa56fdsafdsa7fdsa890$'
.codestart:mov ax,@datamov ds,axcall countermov ah,4chint 21hcounter procpush axpush bxpush dxpush simov bx,offset stringsmov si,0mov ax,0startcount:mov dl,[bx][si]cmp dl, '0'jl nextloopcmp dl,'9'jg nextloopinc axnextloop:cmp dl,'$'je displayinc sijmp startcountdisplay:mov dx,10div dladd al,'0'add ah,'0'push axmov dl,almov ah,02hint 21hpop axmov dl,ahmov ah,02hint 21hpop sipop dxpop bxpop axretcounter endpend start