鱼C论坛

 找回密码
 立即注册
查看: 305|回复: 3

求助小程序

[复制链接]
发表于 2024-4-8 15:25:55 | 显示全部楼层 |阅读模式

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

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

x
我需要建立一个area.asm 文件。里面有一个function 叫 area。 需要运算出圆的面积,派 = 22/7 。
里面会调用一个lib文件extern libPuhfessorP, 来得到用户输入半径。
call libPuhfessorP
mov [INPUTTED_LONG], 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.

请问大神们这样的程序怎么写?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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 [radius], eax   ; 将半径存储到radius变量中

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

    ; 计算圆的面积
    mov eax, [radius]
    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 [radius], eax   ; 将半径存储到radius变量中

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

    ; 计算圆的面积
    mov eax, [radius]
    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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

不太对啊,人工智障的回答还差一点
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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, [radius]
    push eax
    push intFormat
    call scanf
    add esp, 8

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

    ; 显示计算得到的圆的面积
    push dword [area]
    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, [radius]
    push eax
    push intFormat
    call scanf
    add esp, 8

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

    ; 显示计算得到的圆的面积
    push dword [area]
    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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-21 18:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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