这就是问题所在
使用平面汇编程序(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
有人能帮我解决这个问题吗?
1条答案
按热度按时间xe55xuns1#
BinStep
字符串
但我的结果并没有像预期的那样出来。
我想知道,当你甚至没有用实际的指令替换注解时,你是否期望会出现一些东西?
无论如何,BinStep 循环实际上是一个无限循环,因为不递增 Count 将导致
cmp [Count], 8
jl BinStep2
永远为真,因此永远跳到循环的顶部!型
HexStep
型
我再次看到一个注解没有被翻译成汇编语言。就像你知道的
shr [Temp], 4
一样简单,这需要变成and [Temp], 15
。PrintHexDigit 子例程有打字错误。
jp GreaterThan9
指令正在测试奇偶校验标志。你需要的是jg GreaterThan9
型
我完全理解你想严格遵循所提供的算法,但你可以从 HexStep 中删除尾调用,仍然遵守:
型