assembly 使用FASM解决以下问题

waxmsbnn  于 2023-08-06  发布在  其他
关注(0)|答案(1)|浏览(98)

这就是问题所在
使用平面汇编程序(FASM)编写一个程序,使用按位运算符将8位整数转换为二进制和十六进制。不要使用外部函数。您可以使用下面的算法。
要求用户输入数字0 - 255并存储到Num中
将Value转换为二进制的算法:
1.将“计数”设置为0。将Num移动到名为Temp的变量中
1.将Temp移入EAX,然后将EAX与128(二进制10000000)进行AND运算
1.如果结果为零,则输出“0”
1.如果结果不为零,则输出“1”
1.将温度左移一位
1.增量计数
1.如果计数< 8,则跳到步骤(2)
将Value转换为十六进制的算法:
1.将Num移动到名为Temp的变量中
1.将温度右移4位,以隔离左移4位
1.如果Temp <=9,打印Temp
1.如果Temp >=10,则在Temp上加55并打印ASCII字符
1.将Num移动到名为Temp的变量中
1.与Temp和15(二进制00001111)以隔离右侧4位数字
1.如果温度<=9,打印数值
1.如果Temp >=10,则在Temp上加55并打印ASCII字符
示例输出:

This x86 assembly program converts an integer to binary and hex.

Enter an integer from 0 - 255: 73
Binary: 01001001
Hex:    49

字符串
我是这样尝试的:

format PE console
include 'win32ax.inc'
section '.code' code readable executable
start:
                cinvoke printf, "Enter an integer from 0-255:"
                cinvoke scanf, "%d", Num
                call BinStep1
                call HexStep1
                cinvoke printf, "%c%c", 10,10
                jmp start

BinStep1:
        cinvoke printf, "%cBin:",10
        mov [Count],0
        mov eax, [Num]
        mov [Temp], eax

BinStep2:
        mov eax, [Temp]
        and eax, 128 ; result is either 0 or 128

BinStep3:
        jnz BinStep4
        ;output a zero
        jmp BinStep5

BinStep4:
        ;output a one

BinStep5:
        ;shift temp left one digit

BinStep6:
        ;increment Count

BinStep7:
        cmp[Count], 8
        jl BinStep2
        ret

HexStep1:
        cinvoke printf, "%cHex: ",10
        mov eax, [Num]
        mov [Temp], eax

HexStep2:
        shr [Temp], 4
        call PrintHexDigit

HexStep5:
        mov eax, [Num]
        mov [Temp], eax

HexStep6:
        ;And Temp with 15 to isolate right 4 bits
        call PrintHexDigit
        ret

PrintHexDigit:
             cmp [Temp],9
             jp GreaterThan9
             cinvoke printf, "%d", [Temp]
             ret

GreaterThan9: ;print A-F
              add [Temp], 55
              cinvoke printf, "%c",[Temp]
              ret


section '.data' data readable writeable

Num   dd  0
Temp  dd  0
Count dd  0

section '.idata' import data readable

library msvcrt,'msvcrt.dll',kerne132,'kerne132.dll'
import msvcrt, printf,'printf',scanf,'scanf'


但我的结果并没有像预期的那样出来。输出结果如下:
output after I run the program
有人能帮我解决这个问题吗?

xe55xuns

xe55xuns1#

BinStep

;output a zero

   ;output a one

   ;shift temp left one digit

   ;increment Count

字符串
但我的结果并没有像预期的那样出来。
我想知道,当你甚至没有用实际的指令替换注解时,你是否期望会出现一些东西?
无论如何,BinStep 循环实际上是一个无限循环,因为不递增 Count 将导致cmp [Count], 8jl BinStep2永远为真,因此永远跳到循环的顶部!

BinStep1:
        cinvoke printf, "%cBinary:",10
        mov [Count],0
        mov eax, [Num]
        mov [Temp], eax

BinStep2:
        mov eax, [Temp]
        and eax, 128           ; result is either 0 or 128

BinStep3:
        jnz BinStep4
        cinvoke printf "0"     ;output a zero
        jmp BinStep5

BinStep4:
        cinvoke printf "1"     ;output a one

BinStep5:
        shl [Temp], 1          ;shift temp left one digit

BinStep6:
        inc [Count]            ;increment Count

BinStep7:
        cmp [Count], 8
        jl  BinStep2
        ret

HexStep

;And Temp with 15 to isolate right 4 bits


我再次看到一个注解没有被翻译成汇编语言。就像你知道的shr [Temp], 4一样简单,这需要变成and [Temp], 15
PrintHexDigit 子例程有打字错误。jp GreaterThan9指令正在测试奇偶校验标志。你需要的是jg GreaterThan9

HexStep1:
        cinvoke printf, "%cHex:   ",10
        mov  eax, [Num]
        mov  [Temp], eax

HexStep2:
        shr  [Temp], 4
        call PrintHexDigit

HexStep5:
        mov  eax, [Num]
        mov  [Temp], eax

HexStep6:
        and  [Temp], 15        ;And Temp with 15 to isolate right 4 bits
        call PrintHexDigit     <<< Tail-call
        ret

PrintHexDigit:
        cmp  [Temp], 9
        jg   GreaterThan9
        cinvoke printf, "%d", [Temp]
        ret

GreaterThan9: ;print A-F
        add  [Temp], 55
        cinvoke printf, "%c", [Temp]
        ret


我完全理解你想严格遵循所提供的算法,但你可以从 HexStep 中删除尾调用,仍然遵守:

HexStep1:
        cinvoke printf, "%cHex:   ",10
        mov  eax, [Num]
        mov  [Temp], eax
        shr  [Temp], 4
        call .Hex
        mov  eax, [Num]
        mov  [Temp], eax
        and  [Temp], 15
.Hex:   cmp  [Temp], 9
        jg   .GT9
        cinvoke printf, "%d", [Temp]
        ret
.GT9:   add  [Temp], 55
        cinvoke printf, "%c", [Temp]
        ret

相关问题