有会做的大神可以教教我吗

考察知识点:

1. 使用proc定义子程序

2. 使用call 和ret 调用和返回子程序

3. 汇编的子程序没有 高级语言函数中的形式参数,可以使用变量(存储器)或者寄存器 来充当函数的参数。         

 

定义并实现一个 子程序Print_Char,该函数的参数为row(用db定义为变量)。

函数的功能是在屏幕上打印row 行 “hello world!”

调用该函数,row=20, 在屏幕上打印20行“hello world!”。

              注: Var DB row ----该变量作为函数的参数

参考GPT和自己的思路:

好的,我可以帮你解决这个问题。

下面是定义并实现子程序Print_Char的汇编代码:

Print_Char PROC
  push bp ;保存bp寄存器的值
  mov bp, sp ;设置bp指向栈顶
  mov cx, [bp+4] ;将参数row的值存储到寄存器cx中
  
  ;循环打印"hello world!"
  L1:
    mov ah, 9h ;设置ah为09h,表示要在屏幕上打印字符串
    mov dx, OFFSET msg ;将msg的地址存储到dx寄存器中
    int 21h ;调用DOS功能,输出字符串
    
    dec cx ;cx自减1
    jnz L1 ;如果cx不为0,继续循环打印
  ret ;返回
Print_Char ENDP

msg db "Hello World!", 0 ;定义输出字符串

然后,我们可以通过调用Print_Char函数来在屏幕上打印出20行“Hello World!”,代码如下:

.model small
.stack
.data
row db 20 ;定义参数row

.code
main PROC
  mov ax, @data ;初始化ds指针
  mov ds, ax
  
  mov al, row ;将row的值存储到al寄存器中
  call Print_Char ;调用Print_Char函数
  
  mov ah, 4ch ;指定DOS功能号为4Ch,表示程序结束
  int 21h ;调用DOS功能
main ENDP

END main

这样程序就可以在屏幕上成功打印出20行“Hello World!”了。

参考GPT和自己的思路:

好的,我来回答你的问题。首先,我们需要使用proc指令定义Print_Char子程序,同时使用call指令调用该子程序并将参数row传递给它。其次,在Print_Char子程序中我们需要使用循环打印语句来输出“hello world!”,并且循环次数应该为参数row的值。最后,我们使用ret指令使Print_Char子程序返回到调用它的位置。下面是实现Print_Char子程序的汇编代码:

Print_Char proc
    ; 声明子程序的局部变量
    push bp
    mov bp, sp
    mov dl, 'h'
    mov ah, 02h
    mov cx, [bp+4] ; 获取参数row的值
    print_loop:
        mov bl, cl ; 将行数保存到寄存器bl中
        mov ah, 02h
        mov dl, 'h'
        int 21h ; 输出字符'h'
        mov dl, 'e'
        int 21h ; 输出字符'e'
        mov dl, 'l'
        int 21h ; 输出字符'l'
        int 21h ; 再输出一个字符'l'
        mov dl, 'o'
        int 21h ; 输出字符'o'
        mov dl, ' '
        int 21h ; 输出空格
        mov dl, 'w'
        int 21h ; 输出字符'w'
        mov dl, 'o'
        int 21h ; 输出字符'o'
        mov dl, 'r'
        int 21h ; 输出字符'r'
        mov dl, 'l'
        int 21h ; 输出字符'l'
        mov dl, 'd'
        int 21h ; 输出字符'd'
        mov dl, '!'
        int 21h ; 输出字符'!'
        mov dl, 0dh ; 换行
        int 21h ; 输出换行符
        mov dl, 0ah
        int 21h
        loop print_loop
    ; 返回到调用该子程序的位置
    pop bp
    ret
Print_Char endp

; 调用Print_Char子程序并传递参数row=20
mov Var, 20 ; 定义变量Var,并赋值为20
mov ah, 09h
lea dx, msg1
int 21h ; 输出提示消息
mov bl, Var
push bl ; 将参数row=20压入堆栈
call Print_Char ; 调用Print_Char函数

我们可以看到,Print_Char子程序的定义使用了proc指令,同时使用bp寄存器和栈来实现参数row的传递和局部变量的定义。在子程序中,我们使用循环打印语句和loop指令来实现在屏幕上输出指定行数的“hello world!”语句。最后使用pop和ret指令使Print_Char子程序返回到调用它的位置。

我觉得这个例子可以帮助你更好地理解汇编语言中子程序的定义、调用和返回过程。如果有其他问题,欢迎随时向我提问。