wsjusen 发表于 2024-4-8 15:25:55

求助小程序

我需要建立一个area.asm 文件。里面有一个function 叫 area。 需要运算出圆的面积,派 = 22/7 。
里面会调用一个lib文件extern libPuhfessorP, 来得到用户输入半径。
call libPuhfessorP
mov , rax

面积按整数 和 非整数n/7
例如用户输入: 6
最终实现:

This area function is fondly brought to you by Bob Dobalina.
Please enter the radius of a circle in whole number of meters: 6
The number 6 was received.
The area of a circle with this radius is 113 and 1/7 square meters.
The integer part of the area will be returned to the main program. Please enjoy
your circles.

请问大神们这样的程序怎么写?

FishC 发表于 2024-4-8 15:26:48

首先,你需要确保你使用的是汇编语言来编写该程序。你可以使用汇编器(如NASM)来将你的代码转换成可执行文件。

下面是一个示例的area.asm文件的框架,其中包含了你描述的功能:

section .data
    ; 定义字符串常量
    message db "This area function is fondly brought to you by Bob Dobalina.", 0
    prompt db "Please enter the radius of a circle in whole number of meters: ", 0
    received db "The number %d was received.", 0
    result db "The area of a circle with this radius is %d and 1/7 square meters.", 0
    goodbye db "The integer part of the area will be returned to the main program. Please enjoy your circles.", 0

section .bss
    radius resb 4   ; 分配4个字节的空间用于存储用户输入的半径

section .text
    extern libPuhfessorP    ; 引入外部库函数

global _start
_start:
    ; 显示欢迎消息
    mov eax, 4
    mov ebx, 1
    mov ecx, message
    mov edx, message_len
    int 0x80

    ; 提示用户输入半径
    mov eax, 4
    mov ebx, 1
    mov ecx, prompt
    mov edx, prompt_len
    int 0x80

    ; 调用外部库函数获取用户输入的半径
    call libPuhfessorP
    mov , eax   ; 将半径存储到radius变量中

    ; 显示接收到的半径
    mov eax, 4
    mov ebx, 1
    mov ecx, received
    mov edx, received_len
    push dword
    call printf
    add esp, 4

    ; 计算圆的面积
    mov eax,
    imul eax, eax      ; 半径的平方
    imul eax, 22       ; 倍增22
    mov edx, 7
    idiv edx         ; 进行整除和取余
    mov ebx, eax       ; 结果存储在ebx寄存器中

    ; 显示圆的面积
    mov eax, 4
    mov ebx, 1
    mov ecx, result
    mov edx, result_len
    push ebx
    call printf
    add esp, 4

    ; 显示结束语
    mov eax, 4
    mov ebx, 1
    mov ecx, goodbye
    mov edx, goodbye_len
    int 0x80

    ; 返回给主程序
    mov eax, 1
    xor ebx, ebx
    int 0x80

section .data
message db "This area function is fondly brought to you by Bob Dobalina.", 0
prompt db "Please enter the radius of a circle in whole number of meters: ", 0
received db "The number %d was received.", 10, 0
result db "The area of a circle with this radius is %d and 1/7 square meters.", 10, 0
goodbye db "The integer part of the area will be returned to the main program. Please enjoy your circles.", 10, 0

section .bss
radius resb 4   ; 分配4个字节的空间用于存储用户输入的半径

section .text
extern printf
global _start

_start:
    ; 调用printf函数显示欢迎消息
    push message
    call printf
    add esp, 4

    ; 调用printf函数提示用户输入半径
    push prompt
    call printf
    add esp, 4

    ; 调用libPuhfessorP函数获取用户输入的半径
    call libPuhfessorP
    mov , eax   ; 将半径存储到radius变量中

    ; 调用printf函数显示接收到的半径
    push dword
    push received
    call printf
    add esp, 8

    ; 计算圆的面积
    mov eax,
    imul eax, eax      ; 半径的平方
    imul eax, 22       ; 倍增22
    mov edx, 7         ; 除以7的结果存放在edx寄存器中
    idiv edx
    mov ebx, eax

    ; 调用printf函数显示圆的面积
    push ebx
    push result
    call printf
    add esp, 8

    ; 调用printf函数显示结束语
    push goodbye
    call printf
    add esp, 4

    ; 返回给主程序
    mov eax, 1
    xor ebx, ebx
    int 0x80

请注意,这只是一个示例框架,你需要根据你的实际需求进行修改和完善。另外,还需要确保你调用的外部库函数(libPuhfessorP)能够正确地获取用户输入的半径。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

wsjusen 发表于 2024-4-10 07:15:06

FishC 发表于 2024-4-8 15:26
首先,你需要确保你使用的是汇编语言来编写该程序。你可以使用汇编器(如NASM)来将你的代码转换成可执行文 ...

不太对啊,人工智障的回答还差一点

FishC 发表于 2024-4-10 07:15:21

wsjusen 发表于 2024-04-10 07:15
不太对啊,人工智障的回答还差一点

非常抱歉,可能我的回答没有完全理解你的问题。你似乎需要一个汇编程序来计算圆的面积,并使用外部库函数获取用户输入的半径。

下面是一个更加详细和清晰的示例代码,供你参考:

section .data
    prompt db 'Please enter the radius of a circle in whole number of meters: ', 0
    result db 'The area of a circle with this radius is %d and 1/7 square meters.', 0
    goodbye db 'The integer part of the area will be returned to the main program. Please enjoy your circles.', 0

section .text
    extern printf, scanf

global main
main:
    ; 显示提示信息,要求用户输入半径
    push prompt
    call printf
    add esp, 4

    ; 获取用户输入的半径并存储在变量radius中
    lea eax,
    push eax
    push intFormat
    call scanf
    add esp, 8

    ; 计算圆的面积
    fldpi               ; 将派加载到FPU寄存器栈中
    fld dword     ; 加载半径到FPU寄存器栈中
    fmulp               ; 乘法操作,得到圆的面积
    fistp dword     ; 将结果转换为整数并存储在area变量中

    ; 显示计算得到的圆的面积
    push dword
    push result
    call printf
    add esp, 8

    ; 显示结束语
    push goodbye
    call printf
    add esp, 4

    ; 返回给主程序
    xor eax, eax
    ret

section .bss
    radius resd 1
    area resd 1

section .data
    intFormat db '%d', 0

section .text
extern printf, scanf

global main
main:
    ; 显示提示信息,要求用户输入半径
    push prompt
    call printf
    add esp, 4

    ; 获取用户输入的半径并存储在变量radius中
    lea eax,
    push eax
    push intFormat
    call scanf
    add esp, 8

    ; 计算圆的面积
    fldpi               ; 将派加载到FPU寄存器栈中
    fld dword     ; 加载半径到FPU寄存器栈中
    fmulp               ; 乘法操作,得到圆的面积
    fistp dword     ; 将结果转换为整数并存储在area变量中

    ; 显示计算得到的圆的面积
    push dword
    push result
    call printf
    add esp, 8

    ; 显示结束语
    push goodbye
    call printf
    add esp, 4

    ; 返回给主程序
    xor eax, eax
    ret

section .bss
    radius resd 1
    area resd 1

请注意,此代码使用了FPU(浮点处理单元)来进行浮点数的运算和转换,并且使用了C标准库函数`printf`和`scanf`来进行输入输出操作。确保你的汇编器和链接器支持这些操作,并且正确地链接外部库函数。另外,你可能需要根据你的编译环境和平台进行一些调整。

希望这次回答能够满足你的需求,如果还有任何问题,请随时提问!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 求助小程序