ZZU汇编语言实验四(保姆级教程)

新发现:其实不用汇编连接运行,直接点提交评测就可以通过。所以把代码复制到那就可以了,直接点击提交评测。

1.实验步骤二:验证单分支结构的字母判断程序

(1)    在桌面打开vscode,新建文件exp4_1.s,将单分支结构的字母判断程序(教材例4-10)编写为完整的汇编语言源程序。

要求:基于例4-10所示源程序做出相应修改,在数据段定义大写字母“N”;然后在代码段将“N”保存到寄存器AL中,利用显示子程序DISPC将该字母显示出来;最后判断AL中的字母是否为大写字母,是的话就转换为小写字母;否则就退出程序。

(2)    保存文件到Desktop/ZZUassembly/ZZUNASM/experiments/exp4/。

(3)    汇编连接,运行程序,观察结果。

(5)    提交测试。

(6)    运行结果示例展示( 并非正确运行结果,仅作为格式展示使用):

A

a

%include"io_linux.inc"

section .data
    char db 'N'

section .text
    global _start

_start:
    mov al,[char]
    call dispc
    call dispcrlf

    cmp al,'A'
    jb done
    cmp al,'Z'
    ja done
    or al,20h
    call dispc
    call dispcrlf

done:
    mov ah,4ch
    int 21h

2.实验步骤三:编写单分支结构的数字判断程序

(1)    在桌面打开vscode,新建文件exp4_2.s。编写单分支结构的数字判断程序。首先在数据段按顺序定义“N”“a”“8”这三个字符,然后按照上述字符顺序,每次显示一个字符并判断这三个字符是否为数字,如果不是数字0~9,就提示错误“Error! Next One!”,如果是数字0~9,就提示“Great!!!”。

(2)    保存文件到Desktop/ZZUassembly/ZZUNASM/experiments/exp4/。

(3)    汇编连接,运行程序,观察结果。

(5)    提交测试。

(6)    运行结果展示:

N

Error! Next One!

a

Error! Next One!

8

Great!

section .data
    chars db 'N', 'a', '8'
    len equ $ - chars
    
    great db 'Great!',0xA
    great_len equ $ - great
    
    error db 'Error! Next One!',0xA
    error_len equ $ - error

section .text
    global _start

_start:
    mov esi, 0

check_loop:
    cmp esi, len
    jge exit

    
    mov eax, 4
    mov ebx, 1
    lea ecx, [chars + esi]
    mov edx, 1
    int 0x80

    
    push esi
    mov eax, 4
    mov ebx, 1
    mov ecx, newline
    mov edx, 1
    int 0x80
    pop esi

    
    mov al, [chars + esi]
    cmp al, '0'
    jl not_digit
    cmp al, '9'
    jg not_digit

    
    mov eax, 4
    mov ebx, 1
    mov ecx, great
    mov edx, great_len
    int 0x80
    jmp next_char

not_digit:
    
    mov eax, 4
    mov ebx, 1
    mov ecx, error
    mov edx, error_len
    int 0x80

next_char:
    inc esi
    jmp check_loop

exit:
    
    mov eax, 1
    mov ebx, 0
    int 0x80

section .data
    newline db 0xA

3.实验步骤四:验证双分支结构的显示数据最高位程序

(1)    在桌面打开vscode,新建文件exp4_3.s,将双分支结构的显示数据最高位程序(教材例4-11)编写为完整的汇编语言源程序。

要求:将数据最高位显示出来,最高位为0显示字符0,最高位为1显示字符1

(2)    保存文件到Desktop/ZZUassembly/ZZUNASM/experiments/exp4/。

(3)    汇编连接,运行程序,观察结果。

(4)    提交测试。

%include"io_linux.inc"
section .data
    dvar dd 80000000h

section .text
    global _start

_start:
    mov ebx, [dvar]
    shl ebx, 1
    jc one
    mov al, '0'
    jmp two

one:
    mov al, '1'

two:
    call dispc
    mov eax, 1
    xor ebx, ebx
    int 0x80


section .bss
    char resb 1

 

4.实验步骤五:编写双分支结构的测试高低位程序

(1)    在桌面打开vscode,新建文件exp4_4.s。仿照上一个实验,编写双分支结构的测试高低位程序(教材习题4.16)。

要求:定义双字变量DVAR57H,测试该数据的最高位,如果为1,则显示字母“L”;如果最高位不为1,则继续测试最低位,如果最低位为1,则显示字母“R”;如果最低位也不为1,则显示字母“M”

(2)    保存文件到Desktop/ZZUassembly/ZZUNASM/experiments/exp4/。

(3)    汇编连接,运行程序,观察结果。

(4)    提交测试。

%include "io_linux.inc"

section .data
    DVAR dd 57h

section .text
    global _start

_start:
    mov ebx, [DVAR]
    shl ebx, 1
    jc display_L
    mov ebx, [DVAR]
    test ebx, 1
    jnz display_R
    mov al, 'M'
    jmp display

display_L:
    mov al, 'L'
    jmp display

display_R:
    mov al, 'R'

display:
    call dispc
    mov eax, 1
    xor ebx, ebx
    int 0x80

dispc:
    mov [char], al
    mov eax, 4
    mov ebx, 1
    mov ecx, char
    mov edx, 1
    int 0x80
    ret

section .bss
    char resb 1

5.实验步骤六:编写计算乘车时长的汇编语言程序

参考上述C语言源程序,编写汇编代码exp4_5.s。

要求:根据火车的出发时间和达到时间计算整个旅途所用的时间。

注意:出发时间、到达时间和经历时间在数据段中定义,数据格式与上述C语言程序一致。

section .data 

start_time db '1200'; 出发时间 

end_time db  '1430';到达时间 

during_time db 2 dup(0), ':', 2 dup (0),0;经过时间

section .text

global _start

_start:

XXXXXX

XXXXXX;将代码段补充完整,编写代码序列计算经历的时间,存放到during_time

mov eax,during_time

call dispmsg

c语言代码如下:

#include <stdio.h>

int main() {
    int start_time, end_time, during_time;
    
    scanf("%4d%4d", &start_time, &end_time);
    
    start_time = start_time / 100 * 60 + start_time % 100;
    end_time = end_time / 100 * 60 + end_time % 100;
    	
    during_time = end_time - start_time;
    
    printf("%02d:%02d", during_time / 60, during_time % 60);
    
    return 0;
}

汇编语言实验如下:

%include "io_linux.inc"

section .data
    start_time db '1200'
    end_time   db '1430'
    during_time db 2 dup(0), ':', 2 dup(0), 0

section .text
    global _start

_start:

    movzx eax, byte [start_time]
    sub eax, '0'
    imul eax, eax, 10
    movzx ebx, byte [start_time+1]
    sub ebx, '0'
    add eax, ebx
    imul eax, eax, 60
    mov edi, eax

    movzx eax, byte [start_time+2]
    sub eax, '0'
    imul eax, eax, 10
    movzx ebx, byte [start_time+3]
    sub ebx, '0'
    add eax, ebx
    add edi, eax

    movzx eax, byte [end_time]
    sub eax, '0'
    imul eax, eax, 10
    movzx ebx, byte [end_time+1]
    sub ebx, '0'
    add eax, ebx
    imul eax, eax, 60
    mov esi, eax

    movzx eax, byte [end_time+2]
    sub eax, '0'
    imul eax, eax, 10
    movzx ebx, byte [end_time+3]
    sub ebx, '0'
    add eax, ebx
    add esi, eax

    mov eax, esi
    sub eax, edi

    mov ebx, 60
    xor edx, edx
    div ebx
    mov ecx, eax
    mov ebx, edx

    mov eax, ecx
    xor edx, edx
    mov edi, 10
    div edi
    add al, '0'
    mov [during_time], al
    add dl, '0'
    mov [during_time+1], dl

    mov eax, ebx
    xor edx, edx
    mov edi, 10
    div edi
    add al, '0'
    mov [during_time+3], al
    add dl, '0'
    mov [during_time+4], dl

    mov eax, during_time
    call dispmsg

    mov eax, 1
    xor ebx, ebx
    int 0x80

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值