Hello World¶
我有十足地把握相信,汇编语言的“hello world”将会是你最晚开始的一个语言入门程序。
补充的准备知识¶
INT 21H¶
INT 21h 是汇编语言中用于与DOS系统进行交互的中断指令,它通常与AH寄存器一起使用来执行各种系统功能。通过设置AH寄存器的值,程序员可以调用DOS提供的各种服务,如文件操作、设备控制、程序终止等.
AH=00h
: 程序终止AH=01h
: 键盘输入并回显,输入的字符存储在AL寄存器AH=02h
: 显示输出,要显示的字符存储在DL寄存器AH=09h
: 显示字符串,字符串的地址存储在DS:DX寄存器,以'$'字符结束AH=0Ah
: 键盘输入到缓冲区,缓冲区的首地址存储在DS:DX寄存器AH=0Bh
: 检验键盘状态,AL寄存器返回00h表示有输入,FFh表示无输入AH=4Ch
: 带返回码结束,返回码存储在AL寄存器
Lea指令¶
下面的两个指令相互等价。
;mov dx,offset str
lea dx,str
Print Hello World¶
assume cs:codesg,ds:data,ss:stack
data segment
string db 'hello world',10,'123','$' ;美元是截止符
data ends
stack segment
db 10 dup (0)
stack ends
codesg segment
start:
mov ax,data
mov ds,ax
mov dx,offset string
mov ah,9
int 21h
mov ah,4cH
int 21h ;安全退出指令
codesg ends
end start
Hello World to HELLO WOLRD¶
现在编写一个汇编程序将这个字符串转为大写的字符串。
注意事项
- 想一想ASCII码层面的转大写字母
- 中间有个空格需要跳过
assume cs:code,ds:data,ss:stack
data segment
str db 'hello world','$'
data ends
stack segment
stack ends
code segment
start:
mov ax,data
mov ds,ax
mov bx,0
mov cx,11
s:
cmp cx,6 ;跳过空格,但是这个明显并不是很好的选择,如果有多个空格的话
je foot
mov al,[bx] ;一定要注意你使用寄存器的位数!
and al,1011111B ;转大写的二进制操作
mov [bx],al
foot:
inc bx
loop s
;mov dx,offset str
lea dx,str ;这里需要把字符串位置给到dx寄存器然后才会打印正确的字符串
mov ah,9
int 21h
mov ah,4ch
int 21H
code ends
end start
数组中最大值、最小值¶
我们仍然以字符串数组为例来读取最大值,最小值的方法同理。
assume cs:code,ds:data,ss:stack
data segment
str db 'Hello WOrld','$'
maximum db 'a'
data ends
stack segment
stack ends
code segment
start:
mov ax,data
mov ds,ax
mov bx,0
mov cx,11
mov ah,0
s:
cmp cx,6
je foot
mov al,[bx]
cmp ah,al
jnb s1
mov ah,al;如果ah>=al仍然会执行s1,在此给了一个很好理解的if语句的转换范例
s1:
mov [bx],al
foot: inc bx
loop s
;mov dx,offset str
lea dx,maximum
mov bx,dx
mov [bx],ah
mov ah,9
int 21h
mov ah,4ch
int 21H
code ends
end start