- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我制作了一个分为两部分的程序。第一部分是用 C 编写的,它从用户那里获取数据。第二个是用汇编及其制作操作编写的。我在将数据从动态分配的数组传递到汇编模块时遇到问题。程序无法正常工作。我做错了什么?
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
extern "C" near void licz_sr( int* );
extern "C" near void licz_znaki( char* );
int *tablica_liczb_dynamiczna;
char tablica_znakow[28]; //[0] = ilosc, [1] = kod szukany, [27] = ilosc wystapien
int wielkosc_tablicy = 0;
int kod;
int menu(), losuj_liczby(), losuj_znaki(), licz_srednia(), sprawdz_ilosc_znakow();
void wczytaj_liczby(), wczytaj_znaki();
int main() {
srand(time(NULL));
//tablica_liczb[0] = 5;
tablica_znakow[0] = 25;
menu();
return 0;
}
int menu(){
printf("\n\n\nCo mam zrobic?\nW = Wyliczyc srednia z losowej tablicy\nP = Policzyc ilosc znakow w losowej tablicy\nX = Wyjsc z programu\n");
kod = getchar();
getchar();
if (kod == 87 || kod == 119) {
//losuj_liczby();
wczytaj_liczby();
//licz_srednia();
}
else if (kod == 80 || kod == 112){
//losuj_znaki();
wczytaj_znaki();
sprawdz_ilosc_znakow();
}
else if (kod == 88 || kod == 120){
return 0;
}
menu();
}
void wczytaj_liczby()
{
printf("Ile znakow wprowadzic? ");
scanf("%d",&wielkosc_tablicy);
printf("wielkosc tab: "); printf("%d",wielkosc_tablicy);
tablica_liczb_dynamiczna = (int*)malloc(wielkosc_tablicy * sizeof(int));
for(int i = 0; i < wielkosc_tablicy; i++){
tablica_liczb_dynamiczna[i] = NULL;
}
printf("\n\nWczytaj liczby:");
for(int j = 0; j < wielkosc_tablicy; j++)
{
scanf("%d", &tablica_liczb_dynamiczna[j]);
printf("\n");
printf("%d", j);printf("element tab "); printf("%d",tablica_liczb_dynamiczna[j]);
printf("\n");
tablica_liczb_dynamiczna[j] = tablica_liczb_dynamiczna[j]-48;
}
licz_srednia();
}
void wczytaj_znaki()
{
for (int i =2; i < tablica_znakow[0]+2; i++)
{
tablica_znakow[i] = NULL;
}
printf("\n\nWczytaj znaki:");
char polecenie[25];
fgets( polecenie, 25, stdin );
for (int j =2; j < tablica_znakow[0]+2; j++)
{
tablica_znakow[j] = polecenie[j-2];
}
}
int licz_srednia()
{
licz_sr(tablica_liczb_dynamiczna);
//printf("\n\nSrednia jest rowna: "); printf("%c", tablica_liczb[6]+48); printf(", a reszta jest rowna: "); printf("%c", tablica_liczb[7]+48);
printf("\n\nSrednia jest rowna: "); printf("%c", tablica_liczb_dynamiczna[6]+48); printf(", a reszta jest rowna: "); printf("%c", tablica_liczb_dynamiczna[7]+48);
//cout << "Srednia jest rowna: " << tablica_liczb_dynamiczna[6]+48 << ", a reszta: " << tablica_liczb_dynamiczna[7]+48 << endl;
return 0;
}
int sprawdz_ilosc_znakow()
{
printf("\n\nWystapienia jakiego znaku mam liczyc? ");
tablica_znakow[1] = getchar();
getchar();
//printf("\n\n");
licz_znaki(tablica_znakow);
printf("\nZnak \""); printf("%c", tablica_znakow[1]); printf("\" wystapil "); printf("%c", tablica_znakow[27]+48);
if (tablica_znakow[27] != 1) printf(" razy.");
else printf(" raz.");
}
以及 assembly 部分。
.model small, C
Dane SEGMENT
Tablica DB (?)
Ilosc DB (?)
Dane ENDS
PUBLIC licz_znaki
.code
licz_znaki PROC near
push bp
mov bp, sp
mov di, [bp+4]
; [bp+4] = adres
; [di] = liczba
; [bp+12] = tab[1]
; [bp+16] = tab[2]
; [bp+20] = tab[3]
; [bp+24] = tab[4]
xor cx, cx
mov cl, [di]
inc di
;inc di
xor ax, ax
xor bx, bx
xor dx, dx
mov ah, [di] ;w ah jest znak, którego szukamy
inc di
;inc di
Petla_z:
mov al, [di] ;w ah jest aktualny znak z tablicy
cmp al, ah
jz Dodaj_do_wyniku
Powrot_do_petli:
inc di
;inc di
loop Petla_z
Dodaj_do_wyniku:
jcxz Koncowka
inc bx ;bh przechowuje ilosc wystapien
jmp short Powrot_do_petli
Koncowka:
mov [di], bx
pop bp
ret
licz_znaki ENDP
PUBLIC licz_sr
.code
licz_sr PROC near
push bp
mov bp, sp
mov di, [bp+4]
mov bx, [di]
; [bp+4] = adres
; [di] = liczba
; [bp+12] = tab[1]
; [bp+16] = tab[2]
; [bp+20] = tab[3]
; [bp+24] = tab[4]
xor cx, cx
mov cl, [di]
inc di
inc di
xor ax, ax
xor dx, dx
Petla_l:
add ax, [di]
inc di
inc di
loop Petla_l
div bx
mov [di], ax
inc di
inc di
mov [di], dx ;wj
pop bp
ret
licz_sr ENDP
end
翻译后的 C 模块:说明:具有普通数组(非动态)的程序正在将数据下载到 [8]
元素数组。用户可以输入5
个数字。汇编模块将平均值返回到表的 [6]
元素,并将除法的其余部分返回到表的 [7]
元素。然后C模块使用printf
函数输出表的[7]和[6]元素。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
extern "C" near void count_averageExtern( int* );
extern "C" near void count_characters( char* );
int *dynamic_arrau;
//char tablica_znakow[28]; //[0] = ilosc, [1] = kod szukany, [27] = ilosc wystapien
int size_of_array = 0;
int code;
int menu(), count_average(), sprawdz_ilosc_znakow();
void download_numbers(), wczytaj_znaki();
int main() {
srand(time(NULL));
//tablica_liczb[0] = 5;
tableOfCharacters[0] = 25;
menu();
return 0;
}
int menu(){
printf("\n\n\nWhat to do?\nW = average\nP = not important\nX = exit\n");
code = getchar();
getchar();
if (code == 87 || code == 119) {
//losuj_liczby();
download_numbers();
count_average();
}
/*else if (kod == 80 || kod == 112){
//losuj_znaki();
wczytaj_znaki();
sprawdz_ilosc_znakow();
}*/
else if (kod == 88 || kod == 120){
return 0;
}
menu();
}
void download_numbers()
{
printf("How many numbers input? ");
scanf("%d",&size_of_array);
dynamic_arrau = (int*)malloc(size_of_array * sizeof(int));
for(int i = 0; i < size_of_array; i++){
dynamic_arrau[i] = NULL;
}
printf("\n\Input numbers:");
for(int j = 0; j < size_of_array; j++)
{
scanf("%d", &dynamic_arrau[j]);
printf("\n");
tablica_liczb_dynamiczna[j] = tablica_liczb_dynamiczna[j]-48;
}
licz_srednia();
}
/*void wczytaj_znaki() {
for (int i =2; i < tablica_znakow[0]+2; i++)
{
tablica_znakow[i] = NULL;
}
printf("\n\nWczytaj znaki:");
char polecenie[25];
fgets( polecenie, 25, stdin );
for (int j =2; j < tablica_znakow[0]+2; j++)
{
tablica_znakow[j] = polecenie[j-2];
}
}
*/
int count_average()
{
count_averageExtern(dynamic_arrau);
//printf("\n\nSrednia jest rowna: "); printf("%c", tablica_liczb[6]+48); printf(", a reszta jest rowna: "); printf("%c", tablica_liczb[7]+48);
printf("\n\nAverage: "); printf("%c", dynamic_arrau[6]+48); printf(", and rest of division: "); printf("%c", dynamic_arrau[7]+48);
return 0;
}
/* int sprawdz_ilosc_znakow()
{
printf("\n\nWystapienia jakiego znaku mam liczyc? ");
tablica_znakow[1] = getchar();
getchar();
//printf("\n\n");
licz_znaki(tablica_znakow);
printf("\nZnak \""); printf("%c", tablica_znakow[1]); printf("\" wystapil "); printf("%c", tablica_znakow[27]+48);
if (tablica_znakow[27] != 1) printf(" razy.");
else printf(" raz.");
}*/
翻译后的组装模块:
.model small, C
Data SEGMENT
Tablica DB (?)
Ilosc DB (?)
Data ENDS
/* PUBLIC licz_znaki
.code
licz_znaki PROC near
push bp
mov bp, sp
mov di, [bp+4]
; [bp+4] = adres
; [di] = liczba
; [bp+12] = tab[1]
; [bp+16] = tab[2]
; [bp+20] = tab[3]
; [bp+24] = tab[4]
xor cx, cx
mov cl, [di]
inc di
;inc di
xor ax, ax
xor bx, bx
xor dx, dx
mov ah, [di] ;w ah jest znak, którego szukamy
inc di
;inc di
Petla_z:
mov al, [di] ;w ah jest aktualny znak z tablicy
cmp al, ah
jz Dodaj_do_wyniku
Powrot_do_petli:
inc di
;inc di
loop Petla_z
Dodaj_do_wyniku:
jcxz Koncowka
inc bx ;bh przechowuje ilosc wystapien
jmp short Powrot_do_petli
Koncowka:
mov [di], bx
pop bp
ret
licz_znaki ENDP
*/
PUBLIC count_averageExtern
.code
count_averageExtern PROC near
push bp
mov bp, sp
mov di, [bp+4]
mov bx, [di]
; [bp+4] = addres
; [di] = number
; [bp+12] = tab[1]
; [bp+16] = tab[2]
; [bp+20] = tab[3]
; [bp+24] = tab[4]
xor cx, cx
mov cl, [di]
inc di
inc di
xor ax, ax
xor dx, dx
Loop_l:
add ax, [di]
inc di
inc di
loop Loop_1
div bx
mov [di], ax
inc di
inc di
mov [di], dx ;wj
pop bp
ret
count_averageExtern ENDP
end
在//
中并不是程序的重要部分。但我认为还是需要理解idea。
我在 Dos shell 中使用 Broland C(BC)。效果很好。该程序应该从用户处获取数据(用户确定数字的数量)。下载的数据保存在动态数组中。然后在汇编模块中程序计算数组中数据的平均值并返回值。对于普通数组来说很容易,但是对于动态数组来说有点棘手......我不知道如何开始。
最佳答案
没有通用答案,因为它是特定于实现的。阅读C11标准(草案 n1570 ),您可能不会看到任何提及 x86 的内容。
您应该阅读 ABI 的文档和 calling conventions与您的特定系统、处理器和 C 编译器相关。某些编译器可能遵循不同调用约定(例如,使用每个函数注释或编译器配置或#pragma
-s)。对于 x86,请首先阅读维基页面(各种)x86 calling conventions (例如 16 位模式下的 cdecl
、fastcall
等...)
如果使用 GCC 编译您的 mycsource.c
C 代码,您可以使用 gcc -fverbose-asm -Wall -O1 -S mycsource.c 进行编译,并研究生成的汇编程序文件 mycsource.s 以了解对汇编程序函数的调用。您还可以使用Inline Assembly Language in C Code .
如果您不使用 GCC,请尝试要求您的 C 编译器发出并保留汇编代码并研究它(并理解、猜测或检查与您的问题相关的调用约定)。如果不可能,请使用一些反汇编程序(或调试器的反汇编工具)。
关于c - 如何将数据从 C 传递到汇编,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44631632/
Github:https://github.com/jjvang/PassIntentDemo 我一直在关注有关按 Intent 传递对象的教程:https://www.javacodegeeks.c
我有一个 View ,其中包含自动生成的 text 类型的 input 框。当我单击“通过电子邮件发送结果”按钮时,代码会将您带到 CalculatedResults Controller 中的 Em
我有一个基本的docker镜像,我将以此为基础构建自己的镜像。我没有基础镜像的Dockerfile。 基本上,基本镜像使用两个--env arg,一个接受其许可证,一个选择在容器中激活哪个框架。我可以
假设我想计算 2^n 的总和,n 范围从 0 到 100。我可以编写以下内容: seq { 0 .. 100 } |> Seq.sumBy ((**) 2I) 但是,这与 (*) 或其他运算符/函数不
我有这个网址: http://www.example.com/get_url.php?ID=100&Link=http://www.test.com/page.php?l=1&m=7 当我打印 $_G
我想将 window.URL.createObjectURL(file) 创建的地址传递给 dancer.js 但我得到 GET blob:http%3A//localhost/b847c5cd-aa
我想知道如何将 typedef 传递给函数。例如: typedef int box[3][3]; box empty, *board[3][3]; 我如何将 board 传递给函数?我
我正在将一些代码从我的 Controller 移动到核心数据应用程序中的模型。 我编写了一个方法,该方法为我定期发出的特定获取请求返回 NSManagedObjectID。 + (NSManagedO
为什么我不能将类型化数组传递到采用 any[] 的函数/构造函数中? typedArray = new MyType[ ... ]; items = new ko.observableArray(ty
我是一名新的 Web 开发人员,正在学习 html5 和 javascript。 我有一个带有“选项卡”的网页,可以使网页的某些部分消失并重新出现。 链接如下: HOME 和 JavaScript 函
我试图将对函数的引用作为参数传递 很难解释 我会写一些伪代码示例 (calling function) function(hello()); function(pass) { if this =
我在尝试调用我正在创建的 C# 项目中的函数时遇到以下错误: System.Runtime.InteropServices.COMException: Operation is not allowed
使用 ksh。尝试重用当前脚本而不修改它,基本上可以归结为如下内容: `expr 5 $1 $2` 如何将乘法命令 (*) 作为参数 $1 传递? 我首先尝试使用“*”,甚至是\*,但没有用。我尝试
我一直在研究“Play for Java”这本书,这本书非常棒。我对 Java 还是很陌生,但我一直在关注这些示例,我有点卡在第 3 章上了。可以在此处找到代码:Play for Java on Gi
我知道 Javascript 中的对象是通过引用复制/传递的。但是函数呢? 当我跳到一些令人困惑的地方时,我正在尝试这段代码。这是代码片段: x = function() { console.log(
我希望能够像这样传递参数: fn(a>=b) or fn(a!=b) 我在 DjangoORM 和 SQLAlchemy 中看到了这种行为,但我不知道如何实现它。 最佳答案 ORM 使用 specia
在我的 Angular 项目中,我最近将 rxjs 升级到版本 6。现在,来自 npm 的模块(在 node_modules 文件夹内)由于一些破坏性更改而失败(旧的进口不再有效)。我为我的代码调整了
这个问题在这里已经有了答案: The issue of * in Command line argument (6 个答案) 关闭 3 年前。 我正在编写一个关于反向波兰表示法的 C 程序,它通过命
$(document).ready(function() { function GetDeals() { alert($(this).attr("id")); } $('.filter
下面是一个例子: 复制代码 代码如下: use strict; #这里是两个数组 my @i =('1','2','3'); my @j =('a','b','c'); &n
我是一名优秀的程序员,十分优秀!