8位无符号乘法运算的汇编实现

版权申诉
0 下载量 20 浏览量 更新于2024-11-11 收藏 1KB ZIP 举报
资源摘要信息:"8bits乘8bits无符号乘法运算" 知识点: 1. 位数定义及运算范围: - 8 bits指的是8位的二进制数,一个8位的无符号整数的取值范围是从0到255。 - 在8位二进制数中进行乘法运算,如果结果仍然在8位的范围内,则不会发生溢出。但如果结果超过8位(即大于255),则需要使用更大的数据类型来存储。 2. 乘法运算原理: - 乘法运算本质上是重复的加法。例如,5乘以3可以理解为5加5加5或者3加3加3加3加3。 - 在二进制系统中,乘法运算可以看作是位移和加法的组合。位移用于实现乘数的倍增,加法用于累加这些倍增的值。 3. 无符号整数的乘法: - 无符号整数意味着所有位均为正数,没有符号位,因此全部32位(在32位计算机中)都可以用来存储数值。 - 对于8位无符号整数而言,其运算主要是在0-255的范围内进行。 4. 汇编语言中的乘法实现: - 汇编语言是面向机器的低级语言,它可以提供对硬件的直接控制。 - 通常,汇编语言中会有专门的指令用于执行乘法,比如在x86架构中使用的MUL指令。 - 在汇编语言中编写8 bits乘8 bits的无符号乘法程序需要处理好结果的存储问题,确保在不超过8位的情况下能正确输出结果。 5. 文件命名规则与含义: - 文件名“8bits乘8bits无符号乘法运算1.asm”和“8bits乘8bits无符号乘法运算.asm”表明了文件中包含的内容。 - 文件名中的数字1可能表示这是一个版本号或是文件序号,意味着可能还有其他相关的文件或者版本。 - “asm”后缀表明这些文件是汇编语言源代码文件。 6. 汇编语言程序编写的注意事项: - 在编写汇编程序时,程序员需要精确控制寄存器的使用,因为寄存器资源有限。 - 程序编写过程中需要考虑数据的对齐,因为不同的处理器可能对于数据的对齐有不同的要求。 - 由于汇编语言与机器语言非常接近,因此需要对CPU的指令集有深入理解。 7. 运算结果的表示方法: - 在汇编语言中,乘法运算的结果通常存放在指定的寄存器中。 - 如果结果超出了8位的范围,则必须考虑到结果的截断或扩展至更大的数据类型。 8. 8位乘法运算在现代计算中的应用: - 尽管现代计算机系统通常都是32位或64位的,但是在某些应用场景中,如嵌入式系统、老旧系统升级或硬件编程等,仍然会用到8位运算。 - 8位乘法运算也常用于教学和算法理解,它能帮助初学者更好地理解乘法运算的原理。 9. 编程实现过程: - 编程实现8位乘法运算的过程包括初始化两个8位数、使用乘法指令执行乘法、处理可能的溢出以及输出最终结果。 - 在汇编程序中,可能需要使用循环和位操作指令来辅助完成乘法的实现。 10. 硬件对乘法运算的支持: - 现代处理器通常都内置了硬件乘法器,可以高效地执行乘法运算。 - 在较老的计算机中,可能没有专用的乘法指令,此时需要通过软件模拟乘法过程。 综上所述,8bits乘8bits无符号乘法运算的学习和实现涉及了计算机基础、汇编语言编程、CPU指令集以及算术运算原理等多方面的知识点。通过研究这类基础的乘法运算,可以加深对计算机硬件及低级语言编程的理解。

clear all; close all; clc; tic bits_options = [0,1,2]; noise_option = 1; b = 4; NT = 2; SNRdBs =[0:2:20]; sq05=sqrt(0.5); nobe_target = 500; BER_target = 1e-3; raw_bit_len = 2592-6; interleaving_num = 72; deinterleaving_num = 72; N_frame = 1e8; for i_bits=1:length(bits_options) bits_option=bits_options(i_bits); BER=zeros(size(SNRdBs)); for i_SNR=1:length(SNRdBs) sig_power=NT; SNRdB=SNRdBs(i_SNR); sigma2=sig_power10^(-SNRdB/10)noise_option; sigma1=sqrt(sigma2/2); nobe = 0; Viterbi_init for i_frame=1:1:N_frame switch (bits_option) case {0}, bits=zeros(1,raw_bit_len); case {1}, bits=ones(1,raw_bit_len); case {2}, bits=randi(1,raw_bit_len,[0,1]); end encoding_bits = convolution_encoder(bits); interleaved=[]; for i=1:interleaving_num interleaved=[interleaved encoding_bits([i:interleaving_num:end])]; end temp_bit =[]; for tx_time=1:648 tx_bits=interleaved(1:8); interleaved(1:8)=[]; QAM16_symbol = QAM16_mod(tx_bits, 2); x(1,1) = QAM16_symbol(1); x(2,1) = QAM16_symbol(2); if rem(tx_time-1,81)==0 H = sq05(randn(2,2)+jrandn(2,2)); end y = Hx; if noise_option==1 noise = sqrt(sigma2/2)(randn(2,1)+j*randn(2,1)); y = y + noise; end W = inv(H'H+sigma2diag(ones(1,2)))H'; X_tilde = Wy; X_hat = QAM16_slicer(X_tilde, 2); temp_bit = [temp_bit QAM16_demapper(X_hat, 2)]; end deinterleaved=[]; for i=1:deinterleaving_num deinterleaved=[deinterleaved temp_bit([i:deinterleaving_num:end])]; end received_bit=Viterbi_decode(deinterleaved); for EC_dummy=1:1:raw_bit_len, if bits(EC_dummy)~=received_bit(EC_dummy), nobe=nobe+1; end if nobe>=nobe_target, break; end end if (nobe>=nobe_target) break; end end = BER(i_SNR) = nobe/((i_frame-1)*raw_bit_len+EC_dummy); fprintf('bits_option:%d,SNR:%d dB,BER:%1.4f\n',bits_option,SNRdB,BER(i_SNR)); end figure; semilogy(SNRdBs,BER); xlabel('SNR(dB)'); ylabel('BER'); title(['Bits_option:',num2str(bits_option)]); grid on; end将这段代码改为有噪声的情况

2023-06-12 上传

clear all; close all; clc;ticits_option = 2;noise_option = 1;raw_bit_len = 2592-6;interleaving_num = 72;deinterleaving_num = 72;N_frame = 1e4;SNRdBs = [0:2:20];sq05 = sqrt(0.5);bits_options = [0, 1, 2]; % 三种bits-option情况obe_target = 500;BER_target = 1e-3;for i_bits = 1:length(bits_options) bits_option = bits_options(i_bits); BER = zeros(size(SNRdBs)); for i_SNR = 1:length(SNRdBs) sig_power = 1; SNRdB = SNRdBs(i_SNR); sigma2 = sig_power * 10^(-SNRdB/10); sigma = sqrt(sigma2/2); nobe = 0; for i_frame = 1:N_frame switch bits_option case 0 bits = zeros(1, raw_bit_len); case 1 bits = ones(1, raw_bit_len); case 2 bits = randi([0,1], 1, raw_bit_len); end encoding_bits = convolution_encoder(bits); interleaved = []; for i = 1:interleaving_num interleaved = [interleaved encoding_bits([i:interleaving_num:end])]; end temp_bit = []; for tx_time = 1:648 tx_bits = interleaved(1:8); interleaved(1:8) = []; QAM16_symbol = QAM16_mod(tx_bits, 2); x(1,1) = QAM16_symbol(1); x(2,1) = QAM16_symbol(2); if rem(tx_time - 1, 81) == 0 H = sq05 * (randn(2,2) + j * randn(2,2)); end y = H * x; if noise_option == 1 noise = sigma * (randn(2,1) + j * randn(2,1)); y = y + noise; end W = inv(H' * H + sigma2 * diag(ones(1,2))) * H'; K_tilde = W * y; x_hat = QAM16_slicer(K_tilde, 2); temp_bit = [temp_bit QAM16_demapper(x_hat, 2)]; end deinterleaved = []; for i = 1:deinterleaving_num deinterleaved = [deinterleaved temp_bit([i:deinterleaving_num:end])]; end received_bit = Viterbi_decode(deinterleaved); for EC_dummy = 1:1:raw_bit_len if nobe >= obe_target break; end if received_bit(EC_dummy) ~= bits(EC_dummy) nobe = nobe + 1; end end if nobe >= obe_target break; end end BER(i_SNR) = nobe / (i_frame * raw_bit_len); fprintf('bits-option: %d, SNR: %d dB, BER: %1.4f\n', bits_option, SNRdB, BER(i_SNR)); end figure; semilogy(SNRdBs, BER); xlabel('SNR (dB)'); ylabel('BER'); title(['Bits-Option: ', num2str(bits_option)]); grid on;end注释这段matlab代码

2023-06-07 上传