汇编 hello world

来源:百度知道 编辑:UC知道 时间:2024/09/22 14:27:55
这个hello world 我实在看不懂,老师也难得见一回。大家帮我注释一下每句话的用意,因为我是真的不太懂这个程序,尤其是那个子程序
stack0 SEGMENT stack
DW 40h DUP(0)
stack0 ENDS

data SEGMENT
Hello DB "Hello,World!",0
data ENDS

code SEGMENT
ASSUME CS:code,DS:data,SS:stack0
main: MOV AX,data
MOV DS,AX
MOV AX,0b800h
MOV ES,AX

MOV DH,10
MOV DL,8
MOV AH,1eh
LEA SI,Hello
CALL Direct

MOV AH,0
INT 16h

MOV AH,4ch
INT 21h

Direct PROC
PUSH BX
PUSH DI
MOV BH,AH
MOV AL,AH
DEC AL
MOV BL,160
MUL BL
MOV DI,AX
DEC AL
MOV AL,DL
MOV BL,2
MUL BL
ADD DI,AX
Next: MOV AL,[SI]
CMP AL,0
JZ return

程序呢其实并不是很难,你有电脑的话就去下载一个王爽的《汇编语言》。

如果你是初学的话这个程序时看不懂的。因为这里没有用传统的中断输出。而是用显存输出的。。

 MOV AX,0b800h ;这里是把0b800h放入ax,为什么呢?因为在这个首地址内的内容是要输出的。实际上是dos下的显存区域,你在这里的数据会自动显示到显示屏上面。(《汇编语言》书的第九章,实验九)

 MOV ES,AX

这里:MOV BL,160,dos下一行有80个字母宽度。为什么要加160呢?因为一个字要分2部分。前部分放ASCII码后面放它输出时候的style如颜色,闪烁(不是这样就反了)

子程序的作用就是把hello里面的内容放入ES:...段的内存区域、

我把程序调试了下。但我也有些不明白的地方。就是为什么它在ES:1230才加入数据?

1E是字母的显示style。

我运行了但是看不到输出。不知道你怎么样?

我这里有个类似的。写的比较直观。

assume cs:code,ds:data

data segment

 db 'Welecome to masm!'

data ends

code segment

start: mov ax,data

 mov ds,ax

 mov ax,0b800h

 mov es,ax

 mov bx,0

 mov di,0

 mov cx,17

 mov es:[bx],byte ptr 42h

s: mov dl,[bx]

 mov es:[di+160*11+54],dl