鱼C论坛

 找回密码
 立即注册
查看: 761|回复: 5

8086简单汇编题

[复制链接]
发表于 2023-10-28 19:35:16 From FishC Mobile | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
设计程序对 0~9 数字序列进行加密,0,1,2,3,4,5,6,7,8,9 对应的密码数字分别是
9,0,8,2,7,4,6,3,1,5,要求键盘输入 4 位数字后马上输出对应的四位密码,如输入
4025,显示输出 7984.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-10-28 19:35:55 | 显示全部楼层
这是一个简单的汇编语言编程问题,你可以使用以下的8086汇编语言代码来解决这个问题:
.model small
.stack 100h

.data
    input db 4 dup(0) ; 用于存储输入的4位数字
    output db 4 dup(0) ; 用于存储输出的4位密码
    encrypt db 9,0,8,2,7,4,6,3,1,5 ; 加密映射表

.code
start:
    mov ax, @data
    mov ds, ax

    ; 从键盘输入4位数字
    mov ah, 1
    lea dx, input
    int 21h
    int 21h
    int 21h
    int 21h

    ; 对输入的每一位数字进行加密
    mov cx, 4
    lea si, input
    lea di, output
encrypt_loop:
    mov al, [si]
    sub al, '0' ; 将字符转换为数字
    xlatb ; 使用加密映射表进行加密
    add al, '0' ; 将数字转换为字符
    mov [di], al
    inc si
    inc di
    loop encrypt_loop

    ; 输出加密后的密码
    mov ah, 9
    lea dx, output
    int 21h

    ; 结束程序
    mov ax, 4c00h
    int 21h
end start

这个程序首先从键盘输入4位数字,然后对每一位数字使用加密映射表进行加密,最后输出加密后的密码。注意,这个程序使用了xlatb指令,这个指令可以根据al寄存器的值从ds:bx指向的表中取出一个字节,所以我们可以用它来实现加密映射表的功能。
请注意,本回答来自GPT-4
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-10-28 19:36:30 | 显示全部楼层
以下是一个使用8086汇编语言编写的程序,可以实现对0~9数字序列进行加密的功能:
.model small
.stack 100h

.data
    msg1 db 10, 13, '请输入4位数字:$'
    msg2 db 10, 13, '对应的四位密码是:$'
    input db 5
    output db 5

.code
main proc
    mov ax, @data
    mov ds, ax

    ; 输出提示信息
    mov ah, 09h
    lea dx, msg1
    int 21h

    ; 读取用户输入的4位数字
    mov ah, 01h
    int 21h
    mov bl, al
    mov ah, 01h
    int 21h
    mov bh, al
    mov ah, 01h
    int 21h
    mov cl, al
    mov ah, 01h
    int 21h
    mov ch, al

    ; 加密数字
    mov al, bl
    sub al, '0'
    mov bl, al
    mov al, output[bl]
    add al, '0'
    mov output[0], al

    mov al, bh
    sub al, '0'
    mov bh, al
    mov al, output[bh]
    add al, '0'
    mov output[1], al

    mov al, cl
    sub al, '0'
    mov cl, al
    mov al, output[cl]
    add al, '0'
    mov output[2], al

    mov al, ch
    sub al, '0'
    mov ch, al
    mov al, output[ch]
    add al, '0'
    mov output[3], al

    ; 输出加密后的密码
    mov ah, 09h
    lea dx, msg2
    int 21h

    mov ah, 09h
    lea dx, output
    int 21h

    mov ax, 4C00h
    int 21h
main endp

end main

这段汇编代码使用了8086汇编的基本指令,通过从键盘读取用户输入的4位数字,然后根据给定的加密规则进行加密,最后将加密后的密码输出到屏幕上。

具体的实现步骤如下:
1. 定义一些用于提示信息、用户输入和输出的变量。
2. 将数据段寄存器DS设置为数据段的基地址。
3. 使用21h功能号09h的中断调用,输出提示信息,要求用户输入4位数字。
4. 使用21h功能号01h的中断调用,依次读取用户输入的4位数字,并保存到BL、BH、CL和CH寄存器中。
5. 根据给定的加密规则,对每一位数字进行加密,并将加密后的结果保存到输出变量中。
6. 使用21h功能号09h的中断调用,输出提示信息,显示加密后的密码。
7. 使用21h功能号09h的中断调用,输出加密后的密码。
8. 使用21h功能号4Ch的中断调用,结束程序执行。

请注意,这段汇编代码是为8086处理器编写的,可能无法在较新的处理器上直接运行。您可以使用DOSBox等模拟器来运行这段代码,或者将代码适当修改以适应您所使用的汇编器和处理器。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-10-28 19:42:04 From FishC Mobile | 显示全部楼层
陶远航 发表于 2023-10-28 19:35
这是一个简单的汇编语言编程问题,你可以使用以下的8086汇编语言代码来解决这个问题:



没学过映射表这个方法,能不能不用
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-10-28 19:42:45 From FishC Mobile | 显示全部楼层
isdkz 发表于 2023-10-28 19:36
以下是一个使用8086汇编语言编写的程序,可以实现对0~9数字序列进行加密的功能:



它的加密规则是什么没看出来,字符串0对应了9,1对应了0没找出规律啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-10-28 20:01:11 | 显示全部楼层
自学8086 发表于 2023-10-28 19:42
没学过映射表这个方法,能不能不用

当然可以,我们可以使用一种更直接的方法,即使用一系列的比较和跳转指令来实现加密。以下是一个不使用映射表的版本:
.model small
.stack 100h

.data
    input db 4 dup(0) ; 用于存储输入的4位数字
    output db 4 dup(0) ; 用于存储输出的4位密码

.code
start:
    mov ax, @data
    mov ds, ax

    ; 从键盘输入4位数字
    mov ah, 1
    lea dx, input
    int 21h
    int 21h
    int 21h
    int 21h

    ; 对输入的每一位数字进行加密
    mov cx, 4
    lea si, input
    lea di, output
encrypt_loop:
    mov al, [si]
    sub al, '0' ; 将字符转换为数字

    ; 使用一系列的比较和跳转指令来实现加密
    cmp al, 0
    je zero
    cmp al, 1
    je one
    cmp al, 2
    je two
    cmp al, 3
    je three
    cmp al, 4
    je four
    cmp al, 5
    je five
    cmp al, 6
    je six
    cmp al, 7
    je seven
    cmp al, 8
    je eight
    cmp al, 9
    je nine
zero:
    mov al, 9
    jmp next
one:
    mov al, 0
    jmp next
two:
    mov al, 8
    jmp next
three:
    mov al, 2
    jmp next
four:
    mov al, 7
    jmp next
five:
    mov al, 4
    jmp next
six:
    mov al, 6
    jmp next
seven:
    mov al, 3
    jmp next
eight:
    mov al, 1
    jmp next
nine:
    mov al, 5
next:
    add al, '0' ; 将数字转换为字符
    mov [di], al
    inc si
    inc di
    loop encrypt_loop

    ; 输出加密后的密码
    mov ah, 9
    lea dx, output
    int 21h

    ; 结束程序
    mov ax, 4c00h
    int 21h
end start
这个版本的程序使用了一系列的比较和跳转指令来实现加密,每一位数字都有一个对应的标签,当输入的数字等于这个数字时,就跳转到对应的标签,然后将加密后的数字存储到输出中。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-22 09:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表