Bootstrap

关于汇编语言入门的几个案例

哈喽,大家好呀~这篇呢我们来看看汇编语言的几个入门小案例。

 🥇个人主页:个人主页                          

🥈系列专栏:日常解决的问题              

🥉与这篇汇编相关的文章:                  

IntelliJ IDEA 常用快捷键IntelliJ IDEA 常用快捷键(开发效率提升的是不只一点点惹)_一个名叫追的程序猿的博客-CSDN博客_idea循环快捷键
操作系统中几种最最最常见的调度算法操作系统中几种最最最常见的调度算法(适用于软件设计师考试与期末考试复习)_一个名叫追的程序猿的博客-CSDN博客
解决Oracle的状态: 失败 -测试失败解决Oracle的状态: 失败 -测试失败: IO 错误: The Network Adapter could not establish the connection_一个名叫追的程序猿的博客-CSDN博客_orcle测试失败

目录

一、开头介绍

二、案例实现

1、Hallo World

2、a + b / a - b

 3、循坏累加

4、进制转换器

 5、红绿灯

三、总结


一、开头介绍

首先啥是汇编语言?

汇编语言(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。不然的话会很折磨。

(求关注)持续更新中……

;