鱼C论坛

 找回密码
 立即注册
查看: 4168|回复: 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 编辑
assume cs:code

code segment

; int getchar(void);
getchar:
        mov     ah, 01h
        int     21h
        xor     ah, ah
        ret

; int putchar(int ch);
putchar:
        push    dx
        mov     dx, ax
        mov     ah, 02h
        int     21h
        mov     ax, dx
        pop     dx
        ret

; int get_number(void);
get_number:
        push    bx
        push    dx
        
        xor     dx, dx
L1:
        call    getchar
        cmp     ax, '0'
        jb      L0
        cmp     ax, '9'
        ja      L0
        mov     bx, ax
        mov     ax, dx
        mov     dx, 10
        mul     dx
        sub     bx, '0'
        add     ax, bx
        mov     dx, ax
        jmp     L1
L0:
        mov     ax, dx
        pop     dx
        pop     bx
        ret

start:
        call    get_number
        mov     si, ax          ; y
        call    get_number
        mov     di, ax          ; x
        
        mov     bx, di
L3:
        mov     di, bx
L2:
        mov     ax, '*'
        call    putchar
        dec     di
        cmp     di, 0
        jne     L2
        mov     ax, 0dh
        call    putchar
        mov     ax, 0ah
        call    putchar
        dec     si
        cmp     si, 0
        jne     L3
        
        mov     ax, 4c00h
        int     21h
code ends
end start
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-10-20 21:12:51 | 显示全部楼层
哪一层的汇编语言?
我可以调用 dos api 吗?
我可以调用 bios api 吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

dos的吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-20 21:15:26 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

code segment

; int getchar(void);
getchar:
        mov     ah, 01h
        int     21h
        xor     ah, ah
        ret

; int putchar(int ch);
putchar:
        push    dx
        mov     dx, ax
        mov     ah, 02h
        int     21h
        mov     ax, dx
        pop     dx
        ret

; int get_number(void);
get_number:
        push    bx
        push    dx
        
        xor     dx, dx
L1:
        call    getchar
        cmp     ax, '0'
        jb      L0
        cmp     ax, '9'
        ja      L0
        mov     bx, ax
        mov     ax, dx
        mov     dx, 10
        mul     dx
        sub     bx, '0'
        add     ax, bx
        mov     dx, ax
        jmp     L1
L0:
        mov     ax, dx
        pop     dx
        pop     bx
        ret

start:
        call    get_number
        mov     si, ax          ; y
        call    get_number
        mov     di, ax          ; x
        
        mov     bx, di
L3:
        mov     di, bx
L2:
        mov     ax, '*'
        call    putchar
        dec     di
        cmp     di, 0
        jne     L2
        mov     ax, 0dh
        call    putchar
        mov     ax, 0ah
        call    putchar
        dec     si
        cmp     si, 0
        jne     L3
        
        mov     ax, 4c00h
        int     21h
code ends
end start
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

大佬 强啊, 第二题能讲下思路嘛,应该也能仿照你这个写出来吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

code segment

; uint16_t function_sum(uint8_t array[], uint16_t size);
; array:        bx
; size:         ax
function_sum:
        push    bx
        push    dx
        push    si
        mov     si, bx
        add     si, ax
        xor     dx, dx
        xor     ax, ax
L0:
        mov     al, [bx]
        add     dx, ax
        inc     bx
        cmp     bx, si
        jb      L0
        mov     ax, dx
        pop     si
        pop     dx
        pop     bx
        ret

; uint8_t function_average(uint16_t sum, uint16_t size);
; sum:  ax
; size: bx
function_average:
        push    cx
        push    dx
        mov     cx, ax
        xor     dx, dx
        div     bx
        mov     ah, ch
        pop     dx
        pop     cx
        ret

start:
        mov     ax, data
        mov     ds, ax
        
        mov     bx, offset a
        mov     ax, 10
        call    function_sum
        mov     bx, offset sum
        add     bx, 0
        mov     [bx], ax
        
        mov     bx, offset b
        mov     ax, 10
        call    function_sum
        mov     bx, offset sum
        add     bx, 2
        mov     [bx], ax
        
        mov     bx, offset _c
        mov     ax, 10
        call    function_sum
        mov     bx, offset sum
        add     bx, 4
        mov     [bx], ax
        
        mov     bx, offset sum
        add     bx, 0
        mov     ax, [bx]
        mov     bx, 10
        call    function_average
        mov     bx, offset average
        add     bx, 0
        mov     [bx], al
        
        mov     bx, offset sum
        add     bx, 2
        mov     ax, [bx]
        mov     bx, 10
        call    function_average
        mov     bx, offset average
        add     bx, 1
        mov     [bx], al
        
        mov     bx, offset sum
        add     bx, 4
        mov     ax, [bx]
        mov     bx, 10
        call    function_average
        mov     bx, offset average
        add     bx, 2
        mov     [bx], al
        
        mov     ax, 4c00h
        int     21h
code ends
end start
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2021-10-20 23:00:39 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-22 22:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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