我有一本书,名叫《Zen of Assembly》,作者是 Michael Abrash。据我所知,所有代码清单都在 x86 汇编中。我下载了 WinASM 和 MASM,这样我就可以组装并链接这些列表。然而,这些列表并不是开箱即用的——事实上,我根本无法让它们工作。例如,以下是第一个清单的代码:
;
; *** Listing 2-1 ***
;
; The precision Zen timer (PZTIMER.ASM)
;
; Uses the 8253 timer to time the performance of code that takes
; less than about 54 milliseconds to execute, with a resolution
; of better than 10 microseconds.
;
; By Michael Abrash 4/26/89
;
; Externally callable routines:
;
; ZTimerOn: Starts the Zen timer, with interrupts disabled.
;
; ZTimerOff: Stops the …Run Code Online (Sandbox Code Playgroud) 我已经打字了DB 13, 10, 'hello world', 0很长时间,但没有想知道 13、10 和 0 是做什么用的。
我最近注意到这样做:
PTHIS
DB 'hello world', 0
Run Code Online (Sandbox Code Playgroud)
产生了相同的结果,所以我想知道第一个参数的用途是什么,以及简单地这样编写是否是一个好主意。有人可以对此写一个快速解释吗?(我想字符串声明将是主题)
我是 8086 的新手,需要一些帮助。我了解 AAM 的基础知识。如果我乘以两个数字,假设 07H 和 09H
MUL AL,BL
AAM
Run Code Online (Sandbox Code Playgroud)
这将在 AH 中存储值 06H,在 AL 中存储值 03H。但假设如果以 3 个十六进制位的值应用 AAM,假设
MOV AL,77H
MOV BL,0AH
MUL BL
AAM
Run Code Online (Sandbox Code Playgroud)
AL最后的内容是什么?
我需要将汇编命令翻译MOV BL,[ALPHA]成 intels 8086 处理器的机器代码。因此,ALPHA 是数据段第 11 个位置的 1 字节变量,已加载到寄存器中DS。
我已经翻译了MOV AL,[ALPHA]我的另一项任务。在这里,我MOV AL/AX,addr在指令集表中找到了 ,这样我就可以将整个内容翻译成1010|0000 1010|0000机器A0 10代码。
我倾向于使用MOV r/m1,r/m2指令集表,但我不是 100% 确定,因为我在选择部件时遇到了问题r/m。由于这是考试的准备,如果有人能提供帮助,我会非常高兴:)
我正在开发汇编项目(使用 tasm),并且在跳跃时遇到了一个非常奇怪的问题,我得到的错误是:相对跳转超出范围(数字)字节,据我了解,当您尝试跳转时对于太多行,这里是(我认为)相关代码:
IDEAL
MODEL small
STACK 100h
proc keyUsagePaint
mov bx,[playerSize]
mov ah,[byte ptr keyHolder]
push [playerX]
pop [tempX]
push [playerY]
pop [tempY]
;Checking the key and jumping accordingly.
keyUsageForPaint:
cmp ah,77
je moveRight
cmp ah,72
je moveUp
cmp ah,75
je moveLeft
cmp ah,80
je moveDown
cmp ah,26
je decBrushSize
cmp ah,27
je incBrushSize
cmp ah,2
je changeColor
cmp ah,3
je changeColor
cmp ah,4
je changeColor
cmp ah,5
je changeColor
cmp ah,6
je changeColor
cmp ah,7
je changeColor
cmp ah,8 …Run Code Online (Sandbox Code Playgroud) 我是初学者,需要将 16 位二进制数转换为十六进制数的帮助。我已经完成了大部分代码,但我需要一些帮助。
输入示例:
1010101111001101
预期输出:
A B C D
电流输出:
AAAC
这是我的代码:
.MODEL SMALL
.STACK 1000h
.DATA
title db 'Convert BIN to HEX:.',13,10,'$'
HEX_Map DB '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'
HEX_Out DB "00", 13, 10, '$' ; string with line feed and '$'-terminator
.CODE
main PROC
mov ax, @DATA ; Initialize DS
mov ds, ax
mov ah, 0
mov al, 3 ;clearing
int 10h
mov ah, 9
lea dx, title
int 21h ;displays title
mov dx, 0
loop16:
mov cx, 16 …Run Code Online (Sandbox Code Playgroud) 是否可以将 8 位值压入堆栈?当我尝试将 AL 压入堆栈时,NASM 给出错误;后来我发现这是因为堆栈保存的是16位值。将 8 位值压入堆栈的正确方法是什么?
(这是8086的)
是否有任何 DOS 函数来执行包含 command.com 行的字符串?我需要类似 C 的东西system(),但对于 DOS 和 FASM。
我已经进入了汇编操作系统开发,目前我正在设置一个两阶段引导加载程序。我已经设置了第一阶段,但是当我重置磁盘并读取第二个扇区时,我在屏幕上看到了一堆乱码。当我尝试调用应该在 加载的代码时0x1000,没有任何反应(据我所知)。我试图找到解决方案,但我发现的解决方案似乎都不起作用,而且我的运气越来越差。这是我的完整代码:
BITS 16
start:
mov ax, 07C0h
add ax, 288
mov ss, ax
mov sp, 4096
mov ax, 07C0h
mov ds, ax
call reset
call read_sector
jmp sector
text_string db "hello, world!", 0
sector equ 1000h
reset:
mov ah, 00h
mov dl, 00h
int 13h
read_sector:
; 1000h (used to be 07E0h, but changed as I realized that I probably needed to accomodate more space for the bootloader)
mov ax, sector
mov es, ax
mov ah, 02h …Run Code Online (Sandbox Code Playgroud) 执行以下两条指令后:
MOV BX, 0FD51H
DEC BX
Run Code Online (Sandbox Code Playgroud)
我得到奇偶校验标志 = 1(表示偶数个)
但是,递减值的二进制表示为:
1111 1101 0101 0000
它有 9 个 1(即奇数个 1)。
此外,NEG BX在此之后执行导致 PF = 0。但是,2 的补码是:
0000 0010 1011 0000有偶数个。所以我期望 PF = 1。