哈喽,大家好呀~这篇呢我们来看看汇编语言的几个入门小案例。
一、开头介绍
首先啥是汇编语言?
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。在汇编语言中,用助记符代替机器指令的操作码,用地址符号或标号代替指令或操作数的地址。在不同的设备中,汇编语言对应着不同的机器语言指令集,通过汇编过程转换成机器指令。特定的汇编语言和特定的机器语言指令集是一一对应的,不同平台之间不可直接移植。
二、案例实现
1、Hallo World
看到这 “哈喽我的” 是不是很熟悉?没错我们学的大多数语言第一个接触到的几乎都是 Hallo World,下面我们来看看代码是如何实现的。(这里我们用的编译工具是 VsCode,插件是MASM/TASM,或者编译工具是 emu8086)
org 100h mov ax, 3 int 10h mov ax, 1003h mov bx, 0 int 10h mov ax, 0b800h mov ds, ax mov [02h], 'H' mov [04h], 'e' mov [06h], 'l' mov [08h], 'l' mov [0ah], 'o' mov [0ch], ',' mov [0eh], 'W' mov [10h], 'o' mov [12h], 'r' mov [14h], 'l' mov [16h], 'd' mov [18h], '!' mov cx, 12 mov di, 03h c: mov [di], 11101100b add di, 2 loop c mov ah, 0 int 16h ret
我们来看下效果
2、a + b / a - b
这里举一个 5 + 10 - 1 的一个例子。
org 100h mov al, 5 mov bl, 10 add bl, al sub bl, 1 mov cx, 8 print: mov ah, 2 mov dl, '0' test bl, 10000000b jz zero mov dl, '1' zero: int 21h shl bl, 1 loop print mov dl, 'b' int 21h mov ah, 0 int 16h ret
我们看下输出,14 的二进制是 00001110h
3、循坏累加
这里我们来一个从1 + 2 + 3 + …… + 98 + 99 + 100 的一个样例。
;课堂作业 ;计算1+2+...+100 DATA SEGMENT COUNT DW 0 ;计数 DATA ENDS STACK SEGMENT PARA STACK BUF DW 20H DUP (0) LEN EQU $-BUF STACK ENDS CODESEG SEGMENT ASSUME CS:CODESEG,SS:STACK,DS:DATA START: MOV AX,STACK MOV SS,AX MOV SP,LEN MOV AX,DATA MOV DS,AX MOV CX,64H MOV AX,0 S: ADD COUNT,01H ADD AX,COUNT LOOP S MOV DL,AL MOV AL,AH CALL DISP_2_HEX MOV AL,DL CALL DISP_2_HEX CALL DISP_CREF MOV AH,4CH INT 21H DISP_2_HEX: PUSH AX PUSH BX PUSHF MOV AH,0 MOV BL,10H DIV BL CALL DISP_1_HEX MOV AL,AH CALL DISP_1_HEX POPF POP BX POP AX RET DISP_1_HEX: PUSH AX PUSH DX PUSHF MOV DL,AL CMP DL,09 JBE L_1 ADD DL,27H L_1: ADD DL,30H MOV AH,02H INT 21H POPF POP DX POP AX RET DISP_CREF: PUSH DX PUSH AX MOV AH,02H MOV DL,0DH INT 21H MOV DL,0AH INT 21H POP AX POP DX RET CODESEG ENDS END START
4、进制转换器
这里我们来看下如何实现十进制转换十六进制
#start=simple.exe# #make_bin# name "simple" mov al, 0A7h out 110, al mov ax, 1234h out 112, ax mov ax, 0 in al, 110 in ax, 112 hlt
我们来看下效果
5、红绿灯
我们先来看看效果图。
我们在来看看代码
#start=Traffic_Lights.exe# name "traffic" mov ax, all_red out 4, ax mov si, offset situation next: mov ax, [si] out 4, ax mov cx, 4Ch mov dx, 4B40h mov ah, 86h int 15h add si, 2 cmp si, sit_end jb next mov si, offset situation jmp next situation dw 0000_0011_0000_1100b s1 dw 0000_0110_1001_1010b s2 dw 0000_1000_0110_0001b s3 dw 0000_1000_0110_0001b s4 dw 0000_0100_1101_0011b sit_end = $ all_red equ 0000_0010_0100_1001b
三、总结
1、汇编语言可以理解为符号化的机器语言。
2、我们使用 MASM/TASM 插件时,记得在插件的扩展设置里面设置好它的 Assember、Emulator、Mode。不然的话会很折磨。