鱼C论坛

 找回密码
 立即注册
查看: 1102|回复: 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.
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

  1. .model small
  2. .stack 100h

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

  7. .code
  8. start:
  9.     mov ax, @data
  10.     mov ds, ax

  11.     ; 从键盘输入4位数字
  12.     mov ah, 1
  13.     lea dx, input
  14.     int 21h
  15.     int 21h
  16.     int 21h
  17.     int 21h

  18.     ; 对输入的每一位数字进行加密
  19.     mov cx, 4
  20.     lea si, input
  21.     lea di, output
  22. encrypt_loop:
  23.     mov al, [si]
  24.     sub al, '0' ; 将字符转换为数字
  25.     xlatb ; 使用加密映射表进行加密
  26.     add al, '0' ; 将数字转换为字符
  27.     mov [di], al
  28.     inc si
  29.     inc di
  30.     loop encrypt_loop

  31.     ; 输出加密后的密码
  32.     mov ah, 9
  33.     lea dx, output
  34.     int 21h

  35.     ; 结束程序
  36.     mov ax, 4c00h
  37.     int 21h
  38. end start
复制代码


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

使用道具 举报

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

  1. .model small
  2. .stack 100h

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

  8. .code
  9. main proc
  10.     mov ax, @data
  11.     mov ds, ax

  12.     ; 输出提示信息
  13.     mov ah, 09h
  14.     lea dx, msg1
  15.     int 21h

  16.     ; 读取用户输入的4位数字
  17.     mov ah, 01h
  18.     int 21h
  19.     mov bl, al
  20.     mov ah, 01h
  21.     int 21h
  22.     mov bh, al
  23.     mov ah, 01h
  24.     int 21h
  25.     mov cl, al
  26.     mov ah, 01h
  27.     int 21h
  28.     mov ch, al

  29.     ; 加密数字
  30.     mov al, bl
  31.     sub al, '0'
  32.     mov bl, al
  33.     mov al, output[bl]
  34.     add al, '0'
  35.     mov output[0], al

  36.     mov al, bh
  37.     sub al, '0'
  38.     mov bh, al
  39.     mov al, output[bh]
  40.     add al, '0'
  41.     mov output[1], al

  42.     mov al, cl
  43.     sub al, '0'
  44.     mov cl, al
  45.     mov al, output[cl]
  46.     add al, '0'
  47.     mov output[2], al

  48.     mov al, ch
  49.     sub al, '0'
  50.     mov ch, al
  51.     mov al, output[ch]
  52.     add al, '0'
  53.     mov output[3], al

  54.     ; 输出加密后的密码
  55.     mov ah, 09h
  56.     lea dx, msg2
  57.     int 21h

  58.     mov ah, 09h
  59.     lea dx, output
  60.     int 21h

  61.     mov ax, 4C00h
  62.     int 21h
  63. main endp

  64. 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等模拟器来运行这段代码,或者将代码适当修改以适应您所使用的汇编器和处理器。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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



没学过映射表这个方法,能不能不用
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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



它的加密规则是什么没看出来,字符串0对应了9,1对应了0没找出规律啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

  1. .model small
  2. .stack 100h

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

  6. .code
  7. start:
  8.     mov ax, @data
  9.     mov ds, ax

  10.     ; 从键盘输入4位数字
  11.     mov ah, 1
  12.     lea dx, input
  13.     int 21h
  14.     int 21h
  15.     int 21h
  16.     int 21h

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

  24.     ; 使用一系列的比较和跳转指令来实现加密
  25.     cmp al, 0
  26.     je zero
  27.     cmp al, 1
  28.     je one
  29.     cmp al, 2
  30.     je two
  31.     cmp al, 3
  32.     je three
  33.     cmp al, 4
  34.     je four
  35.     cmp al, 5
  36.     je five
  37.     cmp al, 6
  38.     je six
  39.     cmp al, 7
  40.     je seven
  41.     cmp al, 8
  42.     je eight
  43.     cmp al, 9
  44.     je nine
  45. zero:
  46.     mov al, 9
  47.     jmp next
  48. one:
  49.     mov al, 0
  50.     jmp next
  51. two:
  52.     mov al, 8
  53.     jmp next
  54. three:
  55.     mov al, 2
  56.     jmp next
  57. four:
  58.     mov al, 7
  59.     jmp next
  60. five:
  61.     mov al, 4
  62.     jmp next
  63. six:
  64.     mov al, 6
  65.     jmp next
  66. seven:
  67.     mov al, 3
  68.     jmp next
  69. eight:
  70.     mov al, 1
  71.     jmp next
  72. nine:
  73.     mov al, 5
  74. next:
  75.     add al, '0' ; 将数字转换为字符
  76.     mov [di], al
  77.     inc si
  78.     inc di
  79.     loop encrypt_loop

  80.     ; 输出加密后的密码
  81.     mov ah, 9
  82.     lea dx, output
  83.     int 21h

  84.     ; 结束程序
  85.     mov ax, 4c00h
  86.     int 21h
  87. end start
复制代码

这个版本的程序使用了一系列的比较和跳转指令来实现加密,每一位数字都有一个对应的标签,当输入的数字等于这个数字时,就跳转到对应的标签,然后将加密后的数字存储到输出中。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-10 07:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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