创建一个 x86 汇编程序,将整数转换为 0 和 1 的 16 位二进制字符串 [英] Creating an x86 assembler program that converts an integer to a 16-bit binary string of 0's and 1's
问题描述
正如问题所暗示的,我必须编写一个 MASM 程序来将整数转换为二进制.我尝试了许多不同的方法,但没有一个对我有帮助.我正在处理的最终代码如下.我在 Visual Studio 中调试代码时遇到访问内存冲突错误.
As the question suggests, I have to write a MASM program to convert an integer to binary. I have tried many different approaches, but none of them helped me at all. The final code I'm working on is as follows. I get an access memory violation error when I debug my code in Visual Studio.
任何有关如何解决错误以及我是否走在正确轨道上的帮助将不胜感激.第一个代码是我的 C++ 代码,它将一个 char 数组传递给一个 .asm
文件以转换为二进制文件.
Any help on how to solve the error and if I'm on the right track or not will be greatly appreciated. The first code is my C++ code which passes a char array to an .asm
file to be converted to binary.
#include <iostream>
using namespace std;
extern "C"
{
int intToBin(char*);
}
int main()
{
char str[17] = { NULL };
for (int i = 0; i < 16; i++)
{
str[i] = '0';
}
cout << "Please enter an integer number :";
cin >>str;
intToBin(str);
cout << " the equivilant binaryis: " << str << endl;
return 0;
}
.asm
文件如下:
.686
.model small
.code
_intToBin PROC ;name of fucntion
start:
push ebp ; save base pointer
mov ebp, esp ; establish stack frame
mov eax, [ebp+8] ; stroing char value into eax
mov ebx, [ebp+12]; adress offset of char array
mov edx,32768 ;storin max 16bit binary in edx
mov ecx,17 ; since its a 16 bit , we do the loop 17 times
nextBite:
test eax,edx ;testing if eax is equal to edx
jz storeZero ;if it is 0 is to be moved into bl
mov bl,'1' ;if not 1 is moved into bl
jmp storeAscBit ;then jump to store ascii bit
storeZero:
mov bl,'0' ;moving 0 into bl register
storeAscBit:
mov [di ],bl ;moving bl (either 1 or 9) into [di]
inc edx ;increasing edx stack by 1 point to go to next bt
shr edx,1 ;shfiting right 1 time so the 1 comes to second
loop nextBite ; do the whole step again
EndifReach:
pop ebp
_intToBin ENDP
END
推荐答案
接下来是使用"atoi"将字符串转换为数字,然后使用汇编将数字转换为二进制的示例:
Next is an example of using "atoi" to convert the string to number, then use assembly to convert the number to binary:
#include "stdafx.h"
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{ char str[6]; // ◄■■ NUMBER IN STRING FORMAT.
int num; // ◄■■ NUMBER IN NUMERIC FORMAT.
char bin[33] = " "; // ◄■■ BUFFER FOR ONES AND ZEROES.
cout << "Enter a number: ";
cin >> str; // ◄■■ CAPTURE NUMBER AS STRING.
num = atoi(str); // ◄■■ CONVERT STRING TO NUMBER.
__asm {
mov eax, num // ◄■■ THE NUMBER.
lea edi, bin // ◄■■ POINT TO VARIABLE "BIN".
mov ecx, 32 // ◄■■ NUMBER IS 32 BITS.
conversion:
shl eax, 1 // ◄■■ GET LEFTMOST BIT.
jc bit1 // ◄■■ IF EXTRACTED BIT == 1
mov [edi], '0'
jmp skip
bit1:
mov [edi], '1'
skip :
inc edi // ◄■■ NEXT POSITION IN "BIN".
loop conversion
}
cout << bin;
return 0;
}
这篇关于创建一个 x86 汇编程序,将整数转换为 0 和 1 的 16 位二进制字符串的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!