我需要将此C代码转换为汇编语言代码
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int answer, i;
int right, wrong;
right = 0;
wrong = 0;
for(i =1; i < 11; i = i+1){
printf("What is %d + %d? ", i,i);
scanf( "%d", &answer);
if(answer == i + 1) {
printf("right! ");
right++;
}
else {
printf("Sorry, you're wrong. ");
printf("The answer is %d. ", i + 1);
wrong++;
}
}
printf("You got %d right and %d wrong. ", right, wrong );
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我真的只需要知道如何将变量与汇编语言中的字符串组合在一起,就像上面的C代码一样.我想我可以处理其他一切.有人可以告诉我.我是否必须使用某种参考[]. …
我正在组装一个简单的游戏,目前我只是想根据键盘上的数字 1 还是 2 向左或向右移动播放器图标(在这种情况下它是一个字符 X)。目前我只有两个 if 然后通过减少或增加 X 坐标值来向左或向右移动我的 X。我正在使用 Irvine 32 库来获取像 Gotoxy 这样的 proc 来获取坐标值。到目前为止,我的程序将 x 显示在正确的起始位置,但是由于某种原因,当我点击 1 或 2 时,x 会向上移动一个空格而不是向左或向右移动。我在我拥有的书中无法弄清楚,我在互联网上找到的东西不在我的装配知识范围内。就目前而言,我只想向左或向右移动我的字符。稍后我将制作适当的 procs 等,但现在这是一个非常奇怪的问题。任何帮助,将不胜感激。下面是我的汇编代码:
TITLE Matrix Rain
; Description:Dodge falling numbers to reach the final level
; Authors: John , Killian
; Revision date:2/11/2015
INCLUDE Irvine32.inc
.data
player byte 'X'; Player Character
direction byte ?; Direction the player moves
startY byte 24; Starting Y position
startX byte 39; Starting X position
breakLoop byte 9 ; base case …Run Code Online (Sandbox Code Playgroud) 我正在stdout使用sys_write系统调用编写汇编语言,如果在写入期间发生错误然后正常退出,我想打印错误消息.
我只能退出但不能使用errno和打印错误信息perror.如果syscall失败,如何处理错误的任何建议.我想根据发生的错误类型打印错误消息.我在Ubuntu 14.04上,我正在使用nasm来编译汇编代码.目前我只做这个:
test rax,rax ; Lets make sure the file descriptor is valid
js skipWrite ;
Run Code Online (Sandbox Code Playgroud) 对于我学校的任务,我需要编写一个C程序,它使用汇编程序进行16位加法.除了结果,EFLAGS也将被退回.
这是我的C程序:
int add(int a, int b, unsigned short* flags);//function must be used this way
int main(void){
unsigned short* flags = NULL;
printf("%d\n",add(30000, 36000, flags);// printing just the result
return 0;
}
Run Code Online (Sandbox Code Playgroud)
目前程序只打印出结果而不是标志,因为我无法得到它们.
这是我使用NASM的汇编程序:
global add
section .text
add:
push ebp
mov ebp,esp
mov ax,[ebp+8]
mov bx,[ebp+12]
add ax,bx
mov esp,ebp
pop ebp
ret
Run Code Online (Sandbox Code Playgroud)
现在一切顺利.但我不知道如何获得必须[ebp+16]指向标志寄存器的指针.教授说我们将不得不使用这个pushfd命令.
我的问题只在于汇编代码.在得到标志的解决方案后,我将修改C程序以发出标志.
我一直在研究这个程序,我必须输入一个字符串,然后在该字符串中显示字符分布.
例如:
如果输入是"minecode",则输出应为
C - 1
O - 1
D - 1
E - 2
I - 1
M - 1
N - 1
这是我试图做的,但我真的不知道如何遍历循环并检查相似的字符然后增加计数.汇编程序是在32位机器上运行的MASM 615.
.686
.MODEL flat, stdcall
.STACK
INCLUDE Irvine32.inc
.DATA
msg0 BYTE "Enter a string of characters: ",0
msg1 BYTE "Character Distribution: ",0
MainArray dword 10000 dup (?)
UniqueChar dword 10000 dup (?)
CharCount dword 10000 dup (?)
.CODE
MAIN PROC
lea edx, msg0
call WriteString
call dumpregs ; 1
call ReadString
mov MainArray, eax
call …Run Code Online (Sandbox Code Playgroud) 我的TASM已安装到我的TASM,TLINK和文件所在的文件夹中.具体来说就是C:/TASM/BIN.运行单个.asm文件时没有问题但是当我包含另一个文件以便我的代码看起来模块化时,会出现这个问题.
我已经包含了6个文件,其中包括printMzpos1.kt.(文件扩展名在汇编文件包含中无关紧要.)我的主文件名是c.asm.该图像显示printMzpos1.kt在我的TASM挂载的文件夹中:

这是我的代码的快照.我包括printMzpos1.kt之后main endp和之前end main.printMzpos1.kt包含打印框的过程.
.model small
.386
.stack 64
.data
colorW db 0Fh
xPos dw ?
currmode db ?
horLineLen dw 120
verLineLen dw 70
include macro.kt
.code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
MAIN proc far
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
mov ax, @data
mov ds, ax
mov es, ax
setVidMode
cls
call printMzPos1
;call move3Boxes
retVidMode
mov ax, 4c00h
int 21h
MAIN endp
include printMzPos1.kt
include printMzPos2.kt
include printMzPos3.kt
include …Run Code Online (Sandbox Code Playgroud) 我正在阅读这本书《从头开始编程》,乔纳森·巴特利特。在这个第一次显示函数调用约定的程序上,我在像书中那样输入后运行它时遇到了分段错误。该函数只从堆栈中取出 2 个数字,并在 %eax 中返回第一个数字的第二个数字幂。
这是有问题的程序:
.code32
.section .data
.section .text
.globl _start
_start:
pushl $3
pushl $2
call power
addl $8, %esp
pushl %eax
pushl $2
pushl $5
call power
addl $8, %esp
popl %ebx
addl %eax, %ebx
movl $1, %eax
int $0x80
.type power, @function
power:
pushl %ebp
movl %esp, %ebp
subl $4, %esp
movl 8(%ebp), %ebx
movl 12(%ebp), %ecx
movl %ebx, -4(%ebp)
power_loop:
cmpl $1, %ecx
je end_power
movl -4(%ebp), %eax
imull %ebx, %eax
movl …Run Code Online (Sandbox Code Playgroud) 我是汇编语言编程的新手,我希望我的输出有单独的行,以便更容易阅读,但是,我编写了代码并让它工作,但后来被告知我实际上无法使用Irvine 程序来创建一个新的行。我的教科书只使用了尔湾的“Crlf”,而其他人在本网站上提出类似问题的代码完全破坏了我的程序,所以现在我迷路了。
我尝试过的一个是:
mov ah, 0Eh ;print new line sequence
mov al, 0Dh
int 10h
mov al, 0Ah
int 10h
Run Code Online (Sandbox Code Playgroud)
无论如何,这里仍然是我的 Irvine 函数的完整代码。有人可以帮助我在不使用“call Crlf”的情况下获得我正在寻找的输出吗?或者让我知道为什么上面的代码破坏了我的程序?我确定我遗漏了一些东西。
INCLUDE Irvine32.inc
.data
prompt BYTE 'Enter a positive integer: ', 0
report1 BYTE 'The sum is: ', 0
report2 BYTE 'The product is: ', 0
report3 BYTE 'The power result is: ', 0
temp DWORD ? ;
.code
main PROC
; Main program control procedure.
; Calls: GetInteger, AddNumbers, MultiplyNumbers,
; WriteInt, CalculatePower
call GetInteger ;Get …Run Code Online (Sandbox Code Playgroud) 我正在尝试向堆栈推送一个值one less than %ecx.
所以我尝试了这个指令:
pushl $(%ecx - 1)
Run Code Online (Sandbox Code Playgroud)
但是我得到了以下错误as.
fact.s: Assembler messages:
fact.s:49: Error: register value used as expression
Run Code Online (Sandbox Code Playgroud)
作为一种解决方法,我做了以下事情:
movl %ecx, %edx
subl $1, %edx
pushl %edx
Run Code Online (Sandbox Code Playgroud)
但有没有办法不使用额外的寄存器(%edx在这种情况下)?并在一个指令?
我曾经在 GAS 上写过脚本。因为我确实使用 GAS 通过聊天和 Google 电子表格管理出勤率。聊天工具是聊天工作。它适用于 Gas(Rhino)。但它不适用于 V8。
我试图将 line19 重写for each (var obj in json){为for (var obj in json){
请告诉我什么是坏的...我应该重写哪个?
function recordTime(){
/*Sheet setting*/
var wsData = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("data"); //DataSheetSetting
var wsStaff = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("coworkers"); //CoworkersMasterSetting
/*ChatworkURLrequest*/
var params = {
headers : {"X-ChatWorkToken" : 'anynumber'},
method : "get"
};
var roomID = anynumber; //ROOMID
var url = "https://api.chatwork.com/v2/rooms/" + roomID + "/messages?force=0"; //GetMessageFromGroupchat
try{
var respons = UrlFetchApp.fetch(url, params); //GetResponseFromChatworkAPIendpoint
var json = JSON.parse(respons.getContentText()); //Returnjson
for …Run Code Online (Sandbox Code Playgroud)