今天开始看汇编了,回家就编了个helloworld级汇编程序,没想到错误百出,不过经过一番调试后,感觉到了很多!
下面结合程序源代码来分析一下,免得再犯同样的错误!
先看代码:
data segment ;数据段定义
msg db 0dh,0ah,'hello$' ;0dh,0ah代表回车换行 字符串末尾要加$号表示字符串结尾了
data ends
stack segment ;堆栈段定义
stack ends
codes segment ;代码段定义
main proc far ;注意,这里用far而不用near是有学问的,在下面会有详细解释
assume cs:codes,ds:data,ss:stack
start:
;下面三行是为了程序返回而设立的
push ds ;保存已存在的数据段
sub ax,ax ;将ax寄存器置0
push ax ;将ax入栈
;将ds设为当前数据段
mov ax,data
mov ds,ax
;下面两行的结果是一样的,可以互换,表示将字符串的起始地址放入dx寄存器
;lea dx,msg ;注意这里没有offset
mov dx,offset msg
;这里是dos第21号功能调用,输出字符串
mov ah,09h
int 21h
;这里是dos第21号功能调用,输入一个字符,将ASCII码存入al
mov ah,0ah
int 21h
;返回dos
ret
main endp
codes ends
end start
下面回答那个关于near和far的问题:
据记载:
far和near是子程序调用时的参数
如果子程序和调用程序在一个段内,子程序参数设置为near
如果子程序和调用程序不在一个段内,子程序参数设置为far
这里主程序定义为far是因为:
系统把主程序当作DOS调用的一个子程序
DOS内核与主程序不是在同一个段地址内
所以主程序参数要用far
调试期间遇到了这么一个问题:会跳出一个错误窗口: 说ntvdm cpu遇到一个硬件错误,不知道啥意思
感谢大家批评指正哈!部分内容来自互联网,《IBM-PC汇编语言程序设计(第二版)》
转载请注明出处!谢谢!
posted @ 2008-07-28 21:55
楚暮四 阅读(89)
评论(0) 编辑 收藏 网摘 所属分类:
汇编