Skip to content

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
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

现在编写一个汇编程序将这个字符串转为大写的字符串。

注意事项

  1. 想一想ASCII码层面的转大写字母
  2. 中间有个空格需要跳过
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