鱼C论坛

 找回密码
 立即注册
查看: 4899|回复: 7

[已解决]汇编的循环结构与子程序结构设计

[复制链接]
发表于 2021-10-20 21:08:03 | 显示全部楼层 |阅读模式

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

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

x
一、编写一个程序,实现如下功能:
从键盘输入两个整数m和n(视为十进制数,取值范围3-9),m和n中间用空格隔开,根据m和n的数值在屏幕上输出m行n列的星号矩阵。例如,当m=3,n=6时,屏幕上显示:
******
******
******

二、编写一个程序,实现如下功能:
数据段定义如下:
data segment
a db 1,2,3,4,5,6,7,8,9,10
b db 10,20,30,40,50,60,70,80,90,100
c db 15,25,35,45,55,65,75,85,95,105
sum dw 3 dup(0)
average db 3 dup(0)
data ends
数据段中含有3个数组,要求分别计算每个数组中各元素的和,以及平均值。将和以及平均值分别存储在以sum、average为首地址的内存单元里。即:以sum为首地址的内存单元里,依次存储a数组元素的和、b数组元素的和以及c数组元素的和;以average为首地址的内存单元里,依次存储a数组元素的平均值、b数组元素的平均值和c数组元素的平均值。
要求用子程序的结构实现,选择适当的参数传递方法。

汇编学的太差了,救命!!!
最佳答案
2021-10-20 21:54:54
本帖最后由 人造人 于 2021-10-20 21:56 编辑
  1. assume cs:code

  2. code segment

  3. ; int getchar(void);
  4. getchar:
  5.         mov     ah, 01h
  6.         int     21h
  7.         xor     ah, ah
  8.         ret

  9. ; int putchar(int ch);
  10. putchar:
  11.         push    dx
  12.         mov     dx, ax
  13.         mov     ah, 02h
  14.         int     21h
  15.         mov     ax, dx
  16.         pop     dx
  17.         ret

  18. ; int get_number(void);
  19. get_number:
  20.         push    bx
  21.         push    dx
  22.         
  23.         xor     dx, dx
  24. L1:
  25.         call    getchar
  26.         cmp     ax, '0'
  27.         jb      L0
  28.         cmp     ax, '9'
  29.         ja      L0
  30.         mov     bx, ax
  31.         mov     ax, dx
  32.         mov     dx, 10
  33.         mul     dx
  34.         sub     bx, '0'
  35.         add     ax, bx
  36.         mov     dx, ax
  37.         jmp     L1
  38. L0:
  39.         mov     ax, dx
  40.         pop     dx
  41.         pop     bx
  42.         ret

  43. start:
  44.         call    get_number
  45.         mov     si, ax          ; y
  46.         call    get_number
  47.         mov     di, ax          ; x
  48.         
  49.         mov     bx, di
  50. L3:
  51.         mov     di, bx
  52. L2:
  53.         mov     ax, '*'
  54.         call    putchar
  55.         dec     di
  56.         cmp     di, 0
  57.         jne     L2
  58.         mov     ax, 0dh
  59.         call    putchar
  60.         mov     ax, 0ah
  61.         call    putchar
  62.         dec     si
  63.         cmp     si, 0
  64.         jne     L3
  65.         
  66.         mov     ax, 4c00h
  67.         int     21h
  68. code ends
  69. end start
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-10-20 21:12:51 | 显示全部楼层
哪一层的汇编语言?
我可以调用 dos api 吗?
我可以调用 bios api 吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-20 21:14:29 | 显示全部楼层
人造人 发表于 2021-10-20 21:12
哪一层的汇编语言?
我可以调用 dos api 吗?
我可以调用 bios api 吗?

dos的吧
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-20 21:15:26 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-20 21:54:54 | 显示全部楼层    本楼为最佳答案   
本帖最后由 人造人 于 2021-10-20 21:56 编辑
  1. assume cs:code

  2. code segment

  3. ; int getchar(void);
  4. getchar:
  5.         mov     ah, 01h
  6.         int     21h
  7.         xor     ah, ah
  8.         ret

  9. ; int putchar(int ch);
  10. putchar:
  11.         push    dx
  12.         mov     dx, ax
  13.         mov     ah, 02h
  14.         int     21h
  15.         mov     ax, dx
  16.         pop     dx
  17.         ret

  18. ; int get_number(void);
  19. get_number:
  20.         push    bx
  21.         push    dx
  22.         
  23.         xor     dx, dx
  24. L1:
  25.         call    getchar
  26.         cmp     ax, '0'
  27.         jb      L0
  28.         cmp     ax, '9'
  29.         ja      L0
  30.         mov     bx, ax
  31.         mov     ax, dx
  32.         mov     dx, 10
  33.         mul     dx
  34.         sub     bx, '0'
  35.         add     ax, bx
  36.         mov     dx, ax
  37.         jmp     L1
  38. L0:
  39.         mov     ax, dx
  40.         pop     dx
  41.         pop     bx
  42.         ret

  43. start:
  44.         call    get_number
  45.         mov     si, ax          ; y
  46.         call    get_number
  47.         mov     di, ax          ; x
  48.         
  49.         mov     bx, di
  50. L3:
  51.         mov     di, bx
  52. L2:
  53.         mov     ax, '*'
  54.         call    putchar
  55.         dec     di
  56.         cmp     di, 0
  57.         jne     L2
  58.         mov     ax, 0dh
  59.         call    putchar
  60.         mov     ax, 0ah
  61.         call    putchar
  62.         dec     si
  63.         cmp     si, 0
  64.         jne     L3
  65.         
  66.         mov     ax, 4c00h
  67.         int     21h
  68. code ends
  69. end start
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-20 22:19:44 | 显示全部楼层

大佬 强啊, 第二题能讲下思路嘛,应该也能仿照你这个写出来吧
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-20 22:43:46 | 显示全部楼层
  1. assume cs:code, ds:data

  2. data segment
  3.         a       db 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
  4.         b       db 10, 20, 30, 40, 50, 60, 70, 80, 90, 100
  5.         _c      db 15, 25, 35, 45, 55, 65, 75, 85, 95, 105
  6.         sum     dw 3 dup(0)
  7.         average db 3 dup(0)
  8. data ends

  9. code segment

  10. ; uint16_t function_sum(uint8_t array[], uint16_t size);
  11. ; array:        bx
  12. ; size:         ax
  13. function_sum:
  14.         push    bx
  15.         push    dx
  16.         push    si
  17.         mov     si, bx
  18.         add     si, ax
  19.         xor     dx, dx
  20.         xor     ax, ax
  21. L0:
  22.         mov     al, [bx]
  23.         add     dx, ax
  24.         inc     bx
  25.         cmp     bx, si
  26.         jb      L0
  27.         mov     ax, dx
  28.         pop     si
  29.         pop     dx
  30.         pop     bx
  31.         ret

  32. ; uint8_t function_average(uint16_t sum, uint16_t size);
  33. ; sum:  ax
  34. ; size: bx
  35. function_average:
  36.         push    cx
  37.         push    dx
  38.         mov     cx, ax
  39.         xor     dx, dx
  40.         div     bx
  41.         mov     ah, ch
  42.         pop     dx
  43.         pop     cx
  44.         ret

  45. start:
  46.         mov     ax, data
  47.         mov     ds, ax
  48.         
  49.         mov     bx, offset a
  50.         mov     ax, 10
  51.         call    function_sum
  52.         mov     bx, offset sum
  53.         add     bx, 0
  54.         mov     [bx], ax
  55.         
  56.         mov     bx, offset b
  57.         mov     ax, 10
  58.         call    function_sum
  59.         mov     bx, offset sum
  60.         add     bx, 2
  61.         mov     [bx], ax
  62.         
  63.         mov     bx, offset _c
  64.         mov     ax, 10
  65.         call    function_sum
  66.         mov     bx, offset sum
  67.         add     bx, 4
  68.         mov     [bx], ax
  69.         
  70.         mov     bx, offset sum
  71.         add     bx, 0
  72.         mov     ax, [bx]
  73.         mov     bx, 10
  74.         call    function_average
  75.         mov     bx, offset average
  76.         add     bx, 0
  77.         mov     [bx], al
  78.         
  79.         mov     bx, offset sum
  80.         add     bx, 2
  81.         mov     ax, [bx]
  82.         mov     bx, 10
  83.         call    function_average
  84.         mov     bx, offset average
  85.         add     bx, 1
  86.         mov     [bx], al
  87.         
  88.         mov     bx, offset sum
  89.         add     bx, 4
  90.         mov     ax, [bx]
  91.         mov     bx, 10
  92.         call    function_average
  93.         mov     bx, offset average
  94.         add     bx, 2
  95.         mov     [bx], al
  96.         
  97.         mov     ax, 4c00h
  98.         int     21h
  99. code ends
  100. end start
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2021-10-20 23:00:39 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-8 01:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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